关于字节对齐的讨论
来源:互联网 发布: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。其中有一些详细介绍字节对齐的链接,大家有兴趣可以看看~
- 关于字节对齐的讨论
- 关于字节对齐和运算顺序优先级的讨论
- 关于字节序的讨论
- 关于VC的字节对齐
- 关于字节对齐的总结
- 关于字节对齐的林林总总
- 关于字节对齐的总结
- 关于C的字节对齐
- 关于arm 的字节对齐
- 关于字节对齐的总结
- 关于字节对齐的理解
- 关于字节对齐的理解
- 关于字节对齐的理解
- 基于结构体sizeof的字节对齐问题讨论
- 对堆栈8字节对齐问题的讨论
- 对堆栈8字节对齐问题的讨论…
- 关于字节对齐问题的解释.
- VC++中关于字节对齐的问题
- ubuntu英文版下安装中文输入法scim
- Xap 包装失败,未将对象引用设置到对象的实例
- 高斯平面直角坐标系
- 算法(algorithm):
- 在windows 上构建android NDK 开发环境
- 关于字节对齐的讨论
- wait_fences: failed to receive reply: 10004003奇怪的错误
- SOJ-2708(简单dp,不会怎么记录路径)
- 工作积累之模板类实例化
- 把数组里面的 奇数 放在 偶数 前面 并排序
- SQLite 入门教程(三)常用约束 Constraints
- ubunt系统中如何切换到root帐户?
- 如何查阅某个用户的uid和gid?
- MSChart使用总结