【发布时间】:2019-08-26 13:50:08
【问题描述】:
我正在考虑通过使用 uint32_t 和 bool[4] 的联合来微优化一个返回 4 个 bool 的函数,然后执行 popcnt 指令来查看 bool 数组中有多少元素为真。
但我不知道标准是否保证 bool 表示为数字,在 true 时只设置 1 位,在 false 时设置 0 位。
如果答案是否定的,那么我有一个后续问题:如果不需要,是否要求表示是恒定的,例如如果我有一个测试来检查转换为 uint_8t 的 true bool 是否为 1(而 false 为 0),这是否意味着程序中 bool 的每个表示都将表现相同。
注意:我知道 bool 不需要为 1byte,但我可以对此进行 static_assert。
【问题讨论】:
-
我正在考虑通过使用 uint32_t 和 bool[4] 的联合来微优化一个返回 4 个 bool 的函数,然后执行 popcnt 指令来查看 bool 数组的元素数量是的。 为什么不直接使用
std::bitset? -
在 C++ 中,不允许使用联合进行类型双关,这会破坏严格的别名。
-
Casting 不提供任何信息。布尔值转换为 1 (
true) 和 0 (false),但这些转换与布尔值的实际表示无关。 -
一些编译器用无效的
bools 做了非常奇怪的事情,所以我不会尝试任何聪明的事情。在此处查看“统一标量”和“无效标量”示例:en.cppreference.com/w/cpp/language/ub
标签: c++ boolean language-lawyer