为什么打包对象的sizeof低于预期?

时间:2017-10-12 21:35:46

标签: c++ sizeof memory-alignment pragma memory-layout

我有以下代码:

#pragma pack(push, 4)

class C {
    public:
        char a;
        char b;
        short c;
        char d;
};
C e;

我不明白为什么sizeof(e)是6。 我认为sizeof(e)将是8 => 1(a)+ 1(b)+ 2(c)+ 1(d)+ 3(用于比对)

1 个答案:

答案 0 :(得分:5)

包装指令设置对齐的上限,而不是最小值。 C的对齐要求仅为2,因此将对齐的上限降低到4对它没有影响。

如果您打算增加对齐方式,可以使用alignas代替(这恰好是标准功能,与打包不同)。

  

但是,为什么填充的数字除以2而不是2的幂?

因为对象的大小只需要是该对象的对齐的倍数。正是这种对齐必须是2的幂。