如果使用 new[] 表达式来创建具有析构函数的对象数组, 数组中的对象可能没有正确对齐
#include <stdint.h> #include <stdio.h> #pragma pack(8) struct A{ int64_t i; char dummy; ~A(){} }; int main(){ A* pa= new A[2]; printf("sizeof(A)= %d, pointer= %p", sizeof(A), pa); }
(我用 VC++ 2010 express 构建 32 位目标)
输出(在我的电脑上)是:
sizeof(A)= 16 pointer= 00344f4c
(sizeof(A)= 16 表明编译器理解 A 的对齐要求并且该结构用 7 个字节填充[编辑:__alignof(A) 也返回 8 ])
我明白为什么会这样:new[] 需要存储数组长度,它为此使用分配内存的前 4 个字节,然后它自己分配数组而不进行适当的填充。
从实际的角度来看,这样的行为肯定是不好的, 但它是否符合标准?
最佳答案
为此,您应该使用 __declspec
。您的代码也在我的计算机上生成了未对齐的对象(使用 VS2010),但是当我更改为 __declspec(align(8))
时,指针正确对齐。
我相信 pragma pack
只会更改结构的大小,而不会对其位置做出任何保证。
关于c++ - new[] 表达式不遵守 Microsoft VC++ 中的对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4827674/