user-0 提问: 关于内存对齐的问题，各位达人帮解答一下

回复:
user: user-1
content: typedef struct { double daa;	  //8 int xx;	          //8         char aaa[13];	// 8 + 8 }Str_A; sizeof(Str_A) = 8 + 8 + 8 + 8 = 32   typedef struct {	 int xx;	                   //4         char aaa[13];	   //4 + 4 + 4 + 4         double daa;        //4 + 4 }Str_B; sizeof(Str_B)  = 4 + 4 + 4 + 4 + 4 + 4 + 4 = 28 这个跟编译器有关。

user: user-2
content: #include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 // //A1.a 0 //A1.b 4 //A1.c 17 // //A2.a 0 //A2.b 4 //A2.c 18 // //A4.a 0 //A4.b 4 //A4.c 20 // //A8.a 0 //A8.b 4 //A8.c 24 // //A16.a 0 //A16.b 4 //A16.c 24 // //

user: user-3
content: #pragma pack(push,4) typedef struct {     double daa;	     int xx;	     char aaa[13];	 }Str_A;  typedef struct {	     int xx;	     char aaa[13];	     double daa; }Str_B; #pragma pack(pop)这样出来都是28吧 #pragma pack(push,2) typedef struct {     double daa;	     int xx;	     char aaa[13];	 }Str_A;  typedef struct {	     int xx;	     char aaa[13];	     double daa; }Str_B; #pragma pack(pop)这样出来都是26吧，没有你说的一个是32一个是28的情况

user: user-4
content: 32位系统下gcc是28，vs是32，32位系统下gcc默认对齐是4字节，vs默认8字节

user: user-5
content: 不同的系统下 跟你结构体保存的起始地址有关吧

user: user-6
content: 引用 3 楼 user-8 的回复:什么编译器啊， 难道32位编译的时候，设置成4个字节以上的时候，还是4个字节啊。  如果16字节设置有效的话应该是 32吧 typedef struct {	          int xx;       假设从0开始	         char aaa[13];	这个从4开始         double daa;     这个必须从8的倍数开始， 那大于（4+13）的只有 24了 }Str_B; 因此总大小 是32  VS实际确认也是32   确实是这样，不好意思，我理解错误了，谢谢。

user: user-7
content: 引用 楼主 sduzhk 的回复:设置16字节对齐,32位编译。 以下两个结构体sizeof(Str_A)为32是正确的, 但是为何sizeof(Str_B) 为28  typedef struct { 	double daa;	 	int xx;	         char aaa[13];	 }Str_A;  typedef struct {	 	int xx;	         char aaa[13];	         double daa; }Str_B;我这运行出来sizeof(Str_B)是32，不是28

user: user-8
content: 什么编译器啊， 难道32位编译的时候，设置成4个字节以上的时候，还是4个字节啊。  如果16字节设置有效的话应该是 32吧 typedef struct {	          int xx;       假设从0开始	         char aaa[13];	这个从4开始         double daa;     这个必须从8的倍数开始， 那大于（4+13）的只有 24了 }Str_B; 因此总大小 是32  VS实际确认也是32

user: user-6
content: typedef struct { int xx;    //4字节         char aaa[13];//16字节         double daa;// 8字节不是16字节的原因: }Str_B;   数据成员对齐规则：结构(struct)(或联合(union))的数据成员，第一个数据成员放在offset为0的地方，以后每个数据成员的对齐按照 #pragma pack指定的数值和这个数据成员自身长度中，比较小的那个进行。

user: user-6
content: 第二个4+16+8不是正好是28么