Visual C++ 提供编译器开关 ( /Zp
) 和pack
编译指示来影响结构成员的对齐。但是,我似乎对它们的工作方式有一些误解。
根据MSDN,对于给定的对齐值 n,
成员的对齐将位于 n 的倍数或成员大小的倍数的边界上,以较小者为准。
让我们假设一个包值为 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 吗?
任何澄清表示赞赏!