Visual C提供编译器开关(/ Zp)和pack pragma来影响struct成员的对齐.但是,我似乎对它们如何运作有一些误解.
根据MSDN,对于给定的对齐值n,
The alignment of a member will be on a boundary that is either a
multiple of n or a multiple of the size of the member,whichever is
smaller.
假设包的值为8个字节(这是默认值).在结构体中,我认为任何大小小于8字节的成员都将处于其自身大小的倍数的偏移量.大小为8字节或更大的任何成员将处于8字节的倍数的偏移量.
现在采取以下计划:
#include <tchar.h> #pragma pack(8) struct Foo { int i1; int i2; char c; }; struct Bar { char c; Foo foo; }; int _tmain(int argc,_TCHAR* argv[]) { int fooSize = sizeof(Foo); // yields 12 Bar bar; int fooOffset = ((int) &bar.foo) - ((int) &bar); // yields 4 return 0; }
Foo结构的大小为12个字节.所以在Bar中,我希望Foo成员位于偏移8(8的倍数),而实际上它是偏移4.为什么呢?
此外,Foo实际上只有4 4 1 = 9字节的数据.编译器会在结尾处自动添加填充字节.但是,如果给定8字节的对齐值,它不应该填充到8的倍数而不是4吗?
任何澄清赞赏!
解决方法
你的摘录解释了这一点,“以较小者为准”.在32位平台上,int是4个字节. 4小于8.因此它具有4字节对齐.
pack pragma导致包装,而不是解压缩.除非有理由否则它不会填补.
原文地址:https://www.jb51.cc/c/112176.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。