What's this: __attribute__((packed))

Here is how I think it works (please correct me if I'm wrong!)

__attribute__((packed)) ensures that structure fields align on one-byte boundaries. If you want to ensure that your structures have the same size on all processors, the packed attribute is how you tell gcc.

As an example, let's define this structure:

Code:
struct s {
char aChar;
int anInt;
};

A processor that aligns on eight-byte boundaries may compile this so that aChar is in the first byte, followed by seven bytes of unused space, then starting anInt in the ninth byte.

A processor that aligns on four-byte boundaries may compile this so that aChar is in the first byte, followed by three bytes of unused space, then starting anInt in the fifth byte.

To force anInt to begin immediately after aChar, you would define the structure like this:

Code:
struct s {
char aChar;
int anInt __attribute__((packed));
};

To test these ideas out, I ran this code on an old Pentium 166:

Code:
#include <stdio.h>

struct s1 {
char a;
int i;
};

struct s2 {
char a;
int i __attribute__((packed));
};

int main( int argc, char* argv[] ) {

struct s1 s_1;
struct s2 s_2;

printf( "sizeof s1 is %d/n" , sizeof(s_1) );
printf( "sizeof s2 is %d/n" , sizeof(s_2) );

return( 0 );
}

And got these results:

Code:
eric.r.turner@turing:~/lab/packed$ ./foo
sizeof s1 is 8
sizeof s2 is 5

Looks like this processor aligns on four-byte boundaries.

你可能感兴趣的:(struct,byte,structure)