Surajeet Bharati
Surajeet Bharati

Reputation: 1433

Understanding memory alignment constraints and padding bytes in C

I have following code snippet.

#include<stdio.h>
int main(){
    typedef struct{
        int a;
        int b;
        int c;
        char ch1;
        int d;
    } str;
    printf("Size: %d \n",sizeof(str));
    return 0;
}

Which is giving output as follows

Size: 20

I know that size of the structure is greater than the summation of the sizes of components of the structure because of padding added to satisfy memeory alignment constraints. I want to know how it is decided that how many bytes of padding have to be added. On what does it depend ? Does it depends on CPU architecture ? And does it depends on compiler also ? I am using here 64bit CPU and gcc compiler. How will the output change if these parameters change.

I know there are similar questions on StackOverflow, but they do not explain this memory alignment constraints thoroughly.

Upvotes: 4

Views: 1059

Answers (3)

banach-space
banach-space

Reputation: 1821

It in general depends on the requirements of the architecture. There's loads over here, but it can be summarized as follows:

Storage for the basic C datatypes on an x86 or ARM processor doesn’t normally start at arbitrary byte addresses in memory. Rather, each type except char has an alignment requirement; chars can start on any byte address, but 2-byte shorts must start on an even address, 4-byte ints or floats must start on an address divisible by 4, and 8-byte longs or doubles must start on an address divisible by 8. Signed or unsigned makes no difference.

In your case the following is probably taking place: sizeof(str) = 4 (4 bytes for int) + 4 (4 bytes for int) + 1 ( 1 byte for char) + 7 (3 bytes padding + 4 bytes for int) = 20

The padding is there so that int is at an address that's a multiple of 4 bytes. This requirement comes from the fact that int is 4 bytes long (my assumption regarding the architecture you're using). But this will vary from one architecture to another.

Upvotes: 5

John Bode
John Bode

Reputation: 123598

On what does it depend ? Does it depends on CPU architecture ? And does it depends on compiler also ?

CPU, operating system, and compiler at least.

Upvotes: 1

Othman Benchekroun
Othman Benchekroun

Reputation: 2038

I know that it depends on the CPU architecture, I think you can find some interesting articles that talks about this on the net, wikipedia is not bad in my opinion.

For me I am using a 64 bit linux machine, and what I can say is that, every field is aligned so that it would be on a memory address divisible by its size (for basic types), for example :

int and float are aligned by 4 (must be in a memory adress divisible by 4)

char and bool by 1 ( which means no padding)

double and pointers are aligned by 8

Best way to avoid padding is to put your fields from largest size to smallest (when there is only basic fields)

When there is composed fields, it a little more difficult for me to explain here, but I think you can figure it out yourself in a paper

Upvotes: 0

Related Questions