关于字节对齐的讨论

来源:互联网 发布:2016年网络流行歌曲 编辑:程序博客网 时间:2024/05/29 10:08

在《程序员面试宝典》上看到的一道题,求结构体的长度。我觉得考虑到字节对齐,char占4位sizeof(test)应该是8+4+4+4=20,可是为什么答案是24?书上也说了如果结构体内有长度大于处理器位数的元素,那么以处理器的位数为对齐单位。

struct{ double a; float b; int c; char d; }test;

书上P49提到的a) 结构体的长度一定是最长的数据元素的整数倍和 b) 如果结构体内存在大于处理器位数的元素,则以处理器的位数为对齐单位;两者本身就是矛盾的。考虑含double元素的结构体数组,如上例,若结构体字节对齐后长度为20,则数组下一个单位double元素则不能对齐。那编译器到底是如何处理的呢?

答案是这是编译器相关的。在GCC上是20字节,在VC上是24字节!

对test中char d做对齐扩展主要是为了满足 test t[2] 数组中&(t[1].a)的地址对齐要求,而Linux/Windows 对齐规则稍有区别。
Linux: 是2(short), 4(大于short)字节对齐
Microsoft对齐要求更严格: K字节基本对象的地址必须是K的倍数,K = 2,4,8
So:
Linux gcc 是20,因为是按4字节对齐。
Windows VS/MinGW gcc 是24,因为有double,是按照8字节对齐。
参考: CSAPP 3.9.3数据对齐。(P170)

详细讨论贴见http://bbs.byr.cn/#!article/CPP/60531。其中有一些详细介绍字节对齐的链接,大家有兴趣可以看看~