压缩类成员的填充

时间:2016-05-11 14:37:17

标签: c++

假设我有两个结构:

// sizeof (Bool) == 1
struct Bool {
    bool val;  // 1 bit
               // 7 bits of padding
};

// sizeof (TwoBools) == 2
struct TwoBools {
    Bool b1, b2;  // 16 bits -- 14 of which are paddings!
};

如前面的示例所示,虽然TwoBools只能占用1个字节(2个bool s和6个填充位),但每个成员{{{ 1}}有自己的填充会导致更大的空间浪费。有可能以任何方式避免这种情况吗?

更新:正如@Olaf在评论中指出的那样,我在原始代码段中的评论不正确。这应该是一个正确的示例(在特定计算机上,特定操作系统,具有特定编译器):

Bool

2 个答案:

答案 0 :(得分:1)

允许编译器在结构中的变量之间插入 padding 字节以进行对齐。

就布尔变量而言,有一个关于最小可寻址单元的规则,在许多平台上是一个字节。

某些编译器可能有 pragma ,允许打包结构。

如果要打包布尔类型,可能需要使用位。

答案 1 :(得分:0)

没有填充。最小的可寻址存储器单元是一(1)个字节。如果您有两个不同的可寻址实体,则必须使用至少两(2)个字节。 sizeof运算符将返回以字节为单位的大小而不是位。

对于您的更新:不,在标准C ++中是不可避免的(不同平台上某些类型的不同内存对齐要求)。对于具有#pragma pack的特定平台,可以避免这种情况。