gpt4 book ai didi

c++ - Visual C++ 中的结构对齐

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

Visual C++ 提供编译器开关 (/Zp) 和 pack pragma 来影响结构成员的对齐。但是,我似乎对它们的工作方式有一些误解。

根据 MSDN , 对于给定的对齐值 n,

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.

让我们假设包值为 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 的倍数吗?

感谢任何澄清!

最佳答案

您的摘录对此进行了解释,“以较小者为准”。在 32 位平台上,int 是 4 个字节。 4比8小,所以4字节对齐。

pack pragma 使事物被打包,而不是解包。除非有理由,否则它不会填充。

关于c++ - Visual C++ 中的结构对齐,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10257995/

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