Visual C++提供编译器开关(
根据MSDN的说法,对于给定的对齐值n,
成员的对齐将在是n的倍数或成员大小的倍数中较小的一个上。
假设pack值为8字节(这是默认值),在结构体内,我认为任何大小小于8字节的成员都将位于其自身大小的倍数偏移量上。任何大小大于等于8字节的成员都将位于8字节的倍数偏移量上。
现在看下面的程序:
“Foo”结构体的大小为12个字节。因此,在“Bar”中,我希望“Foo”成员在偏移量8处(8的倍数),但实际上它位于偏移量4处。为什么会这样?
另外,“Foo”只有4+4+1=9个字节的数据。编译器会自动添加填充字节到结尾。但是,考虑到8字节对齐值,难道不应该填充到8的倍数而不是4吗?
任何澄清都将不胜感激!
/Zp
)和pack
预处理指令来影响结构体成员的对齐方式。然而,我好像对它们的工作原理存在一些误解。根据MSDN的说法,对于给定的对齐值n,
成员的对齐将在是n的倍数或成员大小的倍数中较小的一个上。
假设pack值为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个字节吗?你在哪台机器上运行这个程序? - Tony The Lion