假设我有两个结构:
// 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
答案 0 :(得分:1)
允许编译器在结构中的变量之间插入 padding 字节以进行对齐。
就布尔变量而言,有一个关于最小可寻址单元的规则,在许多平台上是一个字节。
某些编译器可能有 pragma ,允许打包结构。
如果要打包布尔类型,可能需要使用位。
答案 1 :(得分:0)
没有填充。最小的可寻址存储器单元是一(1)个字节。如果您有两个不同的可寻址实体,则必须使用至少两(2)个字节。 sizeof
运算符将返回以字节为单位的大小而不是位。
对于您的更新:不,在标准C ++中是不可避免的(不同平台上某些类型的不同内存对齐要求)。对于具有#pragma pack
的特定平台,可以避免这种情况。