выражение new [] не учитывает выравнивание в Microsoft VC ++

Если выражение 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);
}

(я создаю 32-разрядную цель с помощью VC ++ 2010 express)

Вывод (на моем компьютере):

 sizeof(A)= 16 pointer= 00344f4c

(sizeof (A) = 16 показывает, что компилятор понять требования к выравниванию для A, и структура дополняется 7 байтами [отредактировано: __alignof (A) также возвращает 8] )

Я понимаю, почему это происходит: new [] должен хранить длину массива и он использует для этой цели первые 4 байта выделенной памяти, а затем выделяет сам массив без надлежащего заполнения.

С практической точки зрения такое поведение определенно плохое, но соответствует ли он стандарту или нет?

6
задан user396672 28 January 2011 в 13:48
поделиться