【发布时间】:2014-04-23 21:37:45
【问题描述】:
考虑以下在 VC++ 2010 中编译的程序:
#pragma pack(push, 1) // 1, 2, 4, 8
struct str_test
{
unsigned int n;
unsigned short s;
unsigned char b[4];
};
#pragma pack(pop)
int main()
{
str_test str;
str.n = 0x01020304;
str.s = 0xa1a2;
str.b[0] = 0xf0;
str.b[1] = 0xf1;
str.b[2] = 0xf2;
str.b[3] = 0xf3;
unsigned char* p = (unsigned char*)&str;
std::cout << sizeof(str_test) << std::endl;
return 0;
}
我在return 0; 行设置断点并在调试器中查看内存窗口,从地址p 开始。我得到以下结果(sizeof 和内存布局,取决于pack):
// 1 - 10 (pack, sizeof)
// 04 03 02 01 a2 a1 f0 f1 f2 f3
// 2 - 10
// 04 03 02 01 a2 a1 f0 f1 f2 f3
// 4 - 12
// 04 03 02 01 a2 a1 f0 f1 f2 f3
// 8 - 12
// 04 03 02 01 a2 a1 f0 f1 f2 f3
两个问题:
为什么
sizeof(str_test)对于 8 包是 12?为什么内存布局一样,不依赖pack值?
【问题讨论】:
-
您的“输出”不一致。你有一个 sizeof==12 和一个 10 字节的转储?
-
@harper - 对于所有包值,
f3之后的字节为cc(调试配置中未初始化的内存)。 -
我读到
// 8 - 12的大小是 12 字节。我只是想知道你为什么省略了尾随的CCs。 ;-)
标签: c++ visual-studio-2010 visual-c++ memory-alignment pack