http://blog.163.com/liurong063327@126/blog/static/864037152011914105819906/
就这篇写的清晰明了。做如下总结:
1、对齐值如何计算
① 如果没有指定对齐值,则对齐值为成员变量中最大的那个值。
② 如果指定的对齐值(#pragam pack(value)// 2,4,6,8....),则对齐值为没有指定对齐值是的值和指定对齐值中的值,较小的那个值。
2、如何计算对齐
变量依照顺序申请空间,各变量必须本身为对齐值或者加起来能凑成对齐值,如果加起来超过了对齐值,则没有超出的部分开始,余下补空填满对齐值
,剩下的从上一个补满对齐值得地方开始算起,继续循环上述操作。直到最后一个变量计算完为止。
------------------------------------------------------------------------------------------------------
题:struct st1{ struct st2{
int i; char c;
char c; int i;
short s; short s;
}; };
上述两结构体在内存中占用字节是多少,即sizeof(struct st1)=?, sizeof(struct st2)=?
解:8, 12
思考:这是struct结构的内存对齐问题,结构体的内存布局依赖于CPU、操作系统、编译器及编译时的对齐选项。其主要有:
1)结构体内部成员对齐
对于结构体内部成员,通常会有这样的规定:各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数。但是也可以看到,有时候某些字段如果严格按照大小紧密排列,根本无法达到这样的目的,因此有时候必须进行padding。各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调 整位置,空缺的字节编译器会自动填充也就是padding。如下图所示:
2)结构体之间对齐(此并不是考虑结构体内部的对齐,而是一组结构体的对齐,在计算单个结构体占用字节时并不考虑)
虑整个结构体的对齐需求。ANSI C标准规定结构体类型的对齐要求不能比它所有字段中要求最严格的那个宽松,可以更严格。实际上要求结构体至少是其中的那个最大的元素大小的整数倍。因为有时候我们使用的是结构体数组,所以结构体的大小还得保证结构体数组中各个结构体满足对齐要求,同时独立的结构体与结构体数组中单个结构体的大小应当是一致的。