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字节对齐.
总结以上是内存溢出为你收集整理的c – MSVC默认内存对齐为8全部内容,希望文章能够帮你解决c – MSVC默认内存对齐为8所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)