c++ - new[] 表达式不遵守 Microsoft VC++ 中的对齐方式

标签 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 个字节,然后它自己分配数组而不进行适当的填充。

从实际的角度来看,这样的行为肯定是不好的, 但它是否符合标准?

最佳答案

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

我相信 pragma pack 只会更改结构的大小,而不会对其位置做出任何保证。

关于c++ - new[] 表达式不遵守 Microsoft VC++ 中的对齐方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4827674/

相关文章:

c++ - variant_row在数据库模板库(C++)中是如何实现的?

c++ - 析构函数问题 - 错误 : Expression:_BLOCK_TYPE_IS_VALID_(pHead->pBlockUse)

mfc - 如何将tchar指针转换为char指针

c++ - 派生类 : using Base class member in initializer list

c++ - Visual C++ 项目 : best unit test setup

c++ - C预处理器问题

c++ - C++ 开源前端的选项

c++ - 如何制作从 C++ 到 Swift 的回调函数指针?

c++ - QObject : Cannot create children for a parent that is in a different thread

c++ - 用于 C++ 的进程安全日志库