布尔值是否需要在C++中表示为真时设置为 1 位/假时设置为 0 位

Is bool required in C++ to be represented with 1 bit set when true/ 0 bits set when false

本文关键字:设置 布尔值 C++ 表示 是否      更新时间:2023-10-16

我正在考虑通过使用 uint32_t 和 bool[4] 的并集来微优化一个返回 4 个布尔值的函数,然后执行 popcnt 指令以查看布尔数组中有多少元素为真。

但我不知道标准是否保证 bool 表示为数字,当真时只设置 1 位,当它为假时设置 0 位。

如果答案是否定的,那么我有一个后续问题:如果不需要,是否要求表示是恒定的,例如,如果我有一个测试来检查投射到uint_8t的真布尔值是否为 1(0 表示 false(,这意味着程序中布尔值的每个表示都将表现相同。

注意:我知道 bool 不需要是 1byte,但我可以static_assert这一点。

我正在考虑对返回 4 个布尔值的函数进行微优化 通过使用 uint32_t 和布尔值的联合[4],然后执行 popcnt 指令查看布尔数组中有多少元素为真。

这将导致未定义的行为,因为访问联合的非活动成员违反了对象生存期规则。 您可能希望改用std::bitset<4>- 它专为此类使用而设计。

请注意,std::bitset不能直接从多个bool构造,则可能必须先编写unsigned long long。 或者,您可以使用如下所示的帮助程序函数:

template <std::size_t N>
constexpr std::bitset<N> pack_bools(const bool (&arr)[N])
{
static_assert(N <= std::numeric_limits<unsigned long long>::digits);
unsigned long long num{0};
for (std::size_t i = 0; i < N; ++i) {
if (arr[i])
num += 1LL << i;
}
return std::bitset<N>{num};
}

用法:

pack_bools({true, false, true, false}); // for example

(测试(

但我不知道标准是否保证布尔值被表示 作为数字,当 true 时仅设置 1 位,当它设置为 0 位时 假。

不,没有这样的保证。 [基本.基本]/10:

类型bool是具有相同对象的不同类型 表示、值表示和对齐要求作为 实现定义的无符号整数类型。类型的值booltruefalse.[注没有signedunsignedshortlongbool类型或值。—完 注]

关于价值表示不再有保证。

如果

答案是否定的,那么我有一个后续问题:如果不是 需要的是表示是恒定的,例如,如果我 有一个测试来检查投射到uint_8t的真实布尔值是否为 1(和 0 对于 false(这是否意味着布尔值的每个表示 程序的行为相同。

不,也没有这样的保证。