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只会改变结构的大小,并且不会对它的位置做出任何保证. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 发布管理 – 非R2与R2版本的Microsoft产品[已关闭]
- 测试 – 是否有适用于Windows Phone 8的Testflight?
- .net – 如何正确检入DLL /程序集到TFS / Visual Studio Te
- Windows Serve R2 008 IIS7创建站点
- windows – 是否有一个’Mercurial Notifier’程序会告诉我
- 如何在Windows 10通用应用程序中获取C#中的本地主机名
- windows-server-2012-r2 – Hyper-V 2012 R2共享存储非共享
- Windows Presentation Foundation(WPF)项目不支持应用程序
- 不同的neo4j企业和neo4j社区的Windows?
- 如何避免“错误LNK2005:”(已经定义的stdlib函数)当编译li
推荐文章
站长推荐
- Windows Phone 7 – 如何在LongListSelector中包
- windows-server-2012-r2 – 如何为Windows Serve
- Windows Server 2016-WinSer 2016标准版与数据中
- 相同的代码,在windows / ubuntu(Keras / Tensorf
- Windows 2008 R2 DHCP – 客户端更新过于频繁
- 在Windows 7上使用C从USB读取数据
- active-directory – Import-Module:未加载指定
- windows – 完全禁用Hyper-V VM中的日期和时间同
- windows-server-2008 – Windows Server 2008中不
- windows-phone-7 – 虽然我有一个PeriodicTask和
热点阅读