如果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只会改变结构的大小,并且不会对它的位置做出任何保证.