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

c – MSVC默认内存对齐为8

发布时间:2020-12-16 05:03:27 所属栏目:百科 来源:网络整理
导读:根据 MSDN,/ Zp命令默认为8,这意味着使用64位对齐边界.我一直认为对于32位应用程序,MSVC编译器将使用32位边界.例如: struct Test{ char foo; int bar;}; 编译器会像这样填充它: struct Test{ char foo; char padding[3]; int bar;}; 因此,由于/ Zp8默认使
根据 MSDN,/ Zp命令默认为8,这意味着使用64位对齐边界.我一直认为对于32位应用程序,MSVC编译器将使用32位边界.例如:
struct Test
{
   char foo;
   int bar;
};

编译器会像这样填充它:

struct Test
{
   char foo;
   char padding[3];
   int bar;
};

因此,由于/ Zp8默认使用,这是否意味着使用上面相同的示例我的填充变为7 4字节:

struct Test
{
   char foo;
   char padding1[7];
   int bar;
   char padding2[4];
}; // Structure has 16 bytes,ending on an 8-byte boundary

这有点荒谬不是吗?我误会了吗?为什么使用如此大的填充物,似乎浪费了空间. 32位系统上的大多数类型甚至不会使用64位,因此大多数变量都有填充(可能超过80%).

解决方法

这不是它的工作原理.成员对齐其大小的倍数. Char为1个字节,short为2,int为4,double为8.结构在末尾填充,以确保在数组中使用struct时成员仍然正确对齐.

8的打包意味着它停止尝试对齐大于8的成员.这是一个实际的限制,内存分配器不会返回比8更好的地址.如果没有正确对齐并结束,则加倍是非常昂贵的跨越缓存线.但是,如果你编写SIMD代码,则需要进行16字节对齐.

(编辑:李大同)

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

    推荐文章
      热点阅读