user-0 提问: 关于在vc++中结构体所占内存大小

回复:
user: user-1
content: http://blog.csdn.net/xuegao007/article/details/1708349

user: user-1
content: 搜索一下“字节对齐”！

user: user-2
content: 任何类型的起始地址要是类型长度的整数倍，这就是对齐问题

user: user-3
content: 结构体1： struct  最高字节double是8，8字节对齐 { int a; //4字节， 与下面的1 字节可共占8字节 char b; //1字节，和上面的int 共占5个字节，对齐需要补齐3个字节 double c; //8字节 } s1; 结构体2： struct 最高字节double是8，8字节对齐 { int a;//4字节， 下面是double 无法拼凑成小于8的空间，补齐4个字节 double c; //8字节，自身对齐 char b; //1字节  ，上面都已对齐，下面无数据，补齐7个字节 } s2;

user: user-4
content: 对齐问题，老问题了。

user: user-5
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-6
content: 原则，相邻层能合并补齐则合并（合并后不能超过最大类型字节数，若超过，则各层补）

user: user-6
content: 结构体内分层，以最大字节为标准补齐.

user: user-7
content: 为什么char  b有时按4字节对齐有时8字节对齐   ---------------- 和前面一个类型有关，按上一个大小对齐

user: user-0
content: 为什么char  b有时按4字节对齐有时8字节对齐

user: user-8
content: 字节对齐。。。

user: user-9
content: 结构体1： struct { int a; char b; double c; } s1; 数据对齐如下图 |----------------int----------|char---char---char---char|   4+1+3(后三个char为填充) |---------------------------double---------------------------|  8 所以16B  结构体2： struct { int a; double c; char b; } s2; 数据对齐如下图 |----------------int-----------------|--------------int---------------| 4+4(后一个int为填充) |-------------------------------double-----------------------------|  8 |char---char---char---char---char---char---char--char--|  1+7(后7个char为填充) 所以占24B  可参看：http://pppboy.blog.163.com/blog/static/30203796201082494026399/

user: user-10
content: struct { int a;  // 4字节 char b;  // 1字节 // 3字节填充，按8对齐 double c; // 8字节 } s1; // 16字节 结构体2： struct { int a; // 4字节 // 4字节填充，按8对齐 double c; // 8字节 char b; // 1字节 // 7字节填充，按8对齐 } s2; // 24字节

user: user-11
content: 搜索一下 alignment and padding

user: user-11
content: struct Foo {   int a;   char b;   double c; } s1;  struct Bar {   int a;   double c;   char b; } s2;  int main() {   return 0; }  cl.exe /nologo /EHsc /d1reportAllClassLayout demo.cpp   class Foo       size(16):         +---  0      | a  4      | b         | <alignment member> (size=3)  8      | c         +---    class Bar       size(24):         +---  0      | a         | <alignment member> (size=4)  8      | c 16      | b         | <alignment member> (size=7)         +---