关于字节对齐的讨论

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

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

您可能感兴趣的与本文相关的镜像

Python3.10

Python3.10

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值