gpt4 book ai didi

c++ - `__declspec(align(#))` 是如何工作的?

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

是的,我已经阅读了这个:http://msdn.microsoft.com/en-us/library/83ythb65.aspx但我不清楚。首先,__declspec(align(#)) 使用它声明的每个对象(在结构中)都从对齐的偏移量开始。那部分很清楚。对齐也由对象所在的结构“继承”。但它不会改变对象的大小,不是吗?准确地说,为什么 sizeof() 在这段代码中:

__declspec(align(32)) struct aType {int a; int b;};
sizeof(aType);

返回 32?

最佳答案

对象的大小用于计算数组中的偏移量以及使用指针时,因此 sizeof(x) 必须始终是对齐值的倍数。在这种情况下,1 x 32。但是如果你有 __declspec(align(32)) struct aType {int a[12]; };,则大小为 2 x 32 = 64,因为 sizeof(a) 为 12 x 4 = 48。如果我们将其更改为对齐 4、8 或 16,则为 48。

它实际工作的方式是编译器在结构的命名成员之后添加一个未命名的填充成员,以将结构填充到它的对齐大小。

如果这样不行,像这样:

 aType *aPtr = new aType[15]; 

aPtr[12].a = 42;

不会正常工作,因为编译器会将 12 乘以 sizeof(aPtr) 以在内部添加到 aPtr

关于c++ - `__declspec(align(#))` 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18165091/

26 4 0
文章推荐: c++ - 列出名为 boost 的托管共享内存的名称
文章推荐: android - HTML