gpt4 book ai didi

c++ - 结构大小和内存布局取决于#pragma pack

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:41 24 4
gpt4 key购买 nike

考虑以下在 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

两个问题:

  1. 为什么 pack 8 的 sizeof(str_test) 是 12?

  2. 为什么内存布局相同且不依赖于 pack 值?

最佳答案

Why sizeof(str_test) is 12 for pack 8?

来自MSDN docs :

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.

在您的情况下,最大的成员是 4bytes,小于 8,因此 4bytes 将用于对齐。

Why memory layout is the same and doesn't depend on the pack value?

不允许编译器对结构成员重新排序,但可以填充成员。如果是 pack 8,它会执行以下操作;

#pragma pack(push, 8)    // largest element is 4bytes so it will be used instead of 8
struct str_test
{
unsigned int n; // 4 bytes
unsigned short s; // 2 bytes
unsigned char b[4]; // 4 bytes
//2 bytes padding here;
};
#pragma pack(pop)

因此 sizeof(str_test) 将为 12。

好吧,编译器 (MSVC2010) 似乎根据类型更改填充位置,在 unsigned char b[4]; 的情况下,它在结构的末尾放置了两个字节填充。在您的情况下,2 个字节 cc cc 恰好在字符数组之后。

#pragma pack(push, 8)    // largest element is 4bytes so it will be used instead of 8
struct str_test
{
unsigned int n; // 4 bytes
unsigned short s; // 2 bytes
//2 bytes padding here;
int; // 4 bytes

};
#pragma pack(pop)

我所做的是将最后一个成员从 char[4] 更改为 int,并且可以通过在这两种情况下减去最后一个和第一个成员的地址来验证分别为 6 和 8。

最后一个成员int情况下的内存转储如下

04 03 02 01 a2 a1 cc cc f0 f1 f2 f3

最后一个成员unsigned char[4]情况下的内存转储如下

04 03 02 01 a2 a1 f0 f1 f2 f3 cc cc

关于c++ - 结构大小和内存布局取决于#pragma pack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22475423/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com