Visual C++同时提供编译器开关(/Zp
)和pack
编译指示以影响结构成员的对齐。但是,我似乎对他们的工作方式有一些误解。Visual C++中的结构比对
根据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吗?
任何澄清赞赏!
你确定你的'int'只有4个字节吗?你在运行什么机器? – 2012-04-21 10:14:17
@Tony:这是一个32位的应用程序。如果一个int是8个字节而不是4个,那么带有其中两个的Foo不可能只有12个字节。:-) – 2012-04-22 12:00:06