Bools结构的大小

时间:2010-10-27 17:03:46

标签: c++ memory

如果1 bool是1字节[8位]那么4个bool的打包结构是32位还是4? pack指令删除了对齐要求,但是它会使得bools集更有效[记忆明智]吗?

4 个答案:

答案 0 :(得分:6)

是。即使是布尔的压缩结构也将使用每布尔至少8位。除非您使用bit fields

答案 1 :(得分:1)

4 bool s。

每个bool都需要一个唯一的地址(因为您可以获取bool的地址)。如果使用位域,可以将大小减小到1 bool,但是你将无法获得单个位域的地址。

答案 2 :(得分:1)

bool的大小可能因操作系统和操作系统以及语言而异。我已经看到它是一个字节,一个单词和一个int(反过来也可以是任何东西)。但是如果sizeof(bool)是1,那么bools的压缩结构将是4(字节)(因此是32位)

为什么不使用:

,而不是搞乱包装和对齐
std::vector<bool>

来自:http://www.cplusplus.com/reference/stl/vector/

它在内部被优化(或应该)为位域。试试吧,你会看到它使用的内存与每个值的单个位一致。

否则,您可以随时滚动自己的库或使用有限的FD_SET宏。

答案 3 :(得分:0)

这是一个实现定义的。该标准没有定义布尔值的大小。

修改

这来自标准:

5.3.3尺寸

sizeof运算符产生其操作数的对象表示中的字节数。操作数 是一个表达式,它没有被计算,或者是带括号的type-id。 sizeof运营商不得 应用于具有函数或不完整类型的表达式,或应用于所有类型之前的枚举类型 已声明枚举数,或此类型的带括号的名称,或指定的左值 一个比特字段。 sizeof(char),sizeof(signed char)和sizeof(unsigned char)是1;该 sizeof应用于任何其他基本类型(3.9.1)的结果是实现定义的。 [注意:在 ticular, sizeof(bool)和sizeof(wchar_t)是实现定义的 .69)] [注意:参见1.7 for 用于定义对象表示的byte和3.9的定义。 ]