为什么包装对象的大小低于预期

Why is the sizeof for a packed object lower than anticipated?

本文关键字:于预期 包装 对象 为什么      更新时间:2023-10-16

我有以下代码:

#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(对齐)

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

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

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

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