关于字节对齐的讨论

本文探讨了结构体在不同编译器下(GCC与VC)的字节对齐规则及长度计算,特别是在包含double类型成员时的情况。Linux下GCC遵循4字节对齐原则,结构体长度为20字节;而在Windows下VS/MinGW GCC遵循8字节对齐原则,长度为24字节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值