voi*_*ter 5 c++ padding memory-alignment visual-c++
根据MSDN,/Zp命令默认为8,这意味着使用64位对齐边界.我一直认为对于32位应用程序,MSVC编译器将使用32位边界.例如:
struct Test
{
char foo;
int bar;
};
Run Code Online (Sandbox Code Playgroud)
编译器会像这样填充它:
struct Test
{
char foo;
char padding[3];
int bar;
};
Run Code Online (Sandbox Code Playgroud)
因此,/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
Run Code Online (Sandbox Code Playgroud)
这有点荒谬不是吗?我误会了吗?为什么使用如此大的填充物,似乎浪费了空间.32位系统上的大多数类型甚至不会使用64位,因此大多数变量都有填充(可能超过80%).
这不是它的工作原理.成员对齐其大小的倍数.Char为1个字节,short为2,int为4,double为8.结构在末尾填充,以确保在数组中使用struct时成员仍然正确对齐.
8的打包意味着它停止尝试对齐大于8的成员.这是一个实际的限制,内存分配器不会返回比8更好的地址.如果没有正确对齐并结束,则加倍是非常昂贵的跨越缓存线.但是,如果你编写SIMD代码,则需要进行16字节对齐.
| 归档时间: |
|
| 查看次数: |
6111 次 |
| 最近记录: |