关于字节对齐的讨论

在《程序员面试宝典》上看到的一道题,求结构体的长度。我觉得考虑到字节对齐,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。其中有一些详细介绍字节对齐的链接,大家有兴趣可以看看~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值