加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

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

发布时间:2020-12-14 02:55:38 所属栏目:Windows 来源:网络整理
导读:如果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),p
如果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只会改变结构的大小,并且不会对它的位置做出任何保证.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读