c/c++结构体对齐小结(转)

以下的结构体定义:
struct A
{
    int i;
    double d;
    char c;
};

问sizeof(struct A)在vs2005的大小?
现在说一下cl.exe(就是微软vs2005的编译器进程)在默认情况下是怎么做的:
1、对齐量的确定:找到A中最大的基本类型成员的大小,在本例中是8(double的大小).
2、当定义一个结构体变量struct A aA; 的时候,aA的起始地址要被由1确定的对齐量整除,在这个例子里,aA的起始地址一定要能被8整除)
3、然后开始分配int i,4字节的空间;再分配double d;注意double 是8字节,所以要分配在被8整除的地方,因此int  i后面空了4字节填充;
4、然后,分配char c;1字节,这个时候struct A的大小是4(这是int i;的) + 4 (这是填充的) + 8(这是double d;的) + 1 (这是char c;的)= 17;
5、最后,要求结构体总的大小要能被由1确定的对齐量整除,在这里是说struct A的大小要能被8整除,所以还要加上7字节的填充字符,一共是24字节。

从这里可以看出,vs2005的编译器的结构体填充有这样的规则(默认情况下,这个默认情况可以通过工程属性上面的选项修改):
1、对齐量的确定:结构体中最大的数据成员的字节数
2、当定义一个结构体变量的时候,起始地址一定能被确定的对齐量整除;
3、分配每一个成员的时候,该成员相对于起始地址的偏移(offset)要能被该成员的大小整除;
4、结构体总的大小能被确定的对齐量整除;

扩充的字节叫做pad(填充字节)

 

----

久了忘了, 转载备忘   虽然这是和平台,编译器, 编译选项相关的

posted @ 2010-12-01 10:37  ntrgx  阅读(395)  评论(0)    收藏  举报