new []表达式不尊重Microsoft VC++中的对齐方式

use*_*672 6 c++ visual-c++

如果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个字节的已分配内存,然后它在没有适当填充的情况下分配数组本身.

从实际的角度来看,这种行为肯定很差,但它是否符合标准?

Pup*_*ppy 8

你应该__declspec为此目的使用.您的代码也会在我的计算机上生成未对齐的对象(使用VS2010),但是当我更改为时__declspec(align(8)),指针已正确对齐.

我相信pragma pack只会改变结构的大小,并且不会对它的位置做出任何保证.