4

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.

3 Answers 3

5

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.

Sign up to request clarification or add additional context in comments.

Comments

1

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.

Comments

0

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.