布尔值是否需要在C++中表示为真时设置为 1 位/假时设置为 0 位
Is bool required in C++ to be represented with 1 bit set when true/ 0 bits set when false
我正在考虑通过使用 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
是具有相同对象的不同类型 表示、值表示和对齐要求作为 实现定义的无符号整数类型。类型的值bool
true
和false
.[注:没有signed
,unsigned
、short
或long
bool
类型或值。—完 注]
关于价值表示不再有保证。
如果答案是否定的,那么我有一个后续问题:如果不是 需要的是表示是恒定的,例如,如果我 有一个测试来检查投射到uint_8t的真实布尔值是否为 1(和 0 对于 false(这是否意味着布尔值的每个表示 程序的行为相同。
不,也没有这样的保证。
- 在没有定义返回类型的函数中返回布尔值,并将结果保存在无错误的char编译中-为什么
- 变量定义到C++布尔值转换
- 如何确保在使用基于布尔值的两个方法之一调用方法时避免分支预测错误
- 重载更少,则运算符返回相反的布尔值
- 将此布尔值传递给此函数的最有效方法是什么?
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 如何设置 c++ 类的布尔值?
- 使用 MAKEWORD / MAKEWPARAM 使用布尔值而不是布尔值
- 将 10 个线程与原子布尔值同步
- 对于完成布尔值设置为 true 后未停止的循环
- 布尔值是否需要在C++中表示为真时设置为 1 位/假时设置为 0 位
- 在布尔值中设置额外的位使其同时为真和为假
- 设置带有布尔值的比特集的最佳方法
- 为什么C++设置迭代器不能转换为布尔值?
- 函数返回布尔值,只设置整个寄存器的1个字节
- CRITICAL_SECTION用于设置和获取单个布尔值
- C++中未设置布尔值的默认值
- 如何将布尔值设置为所需状态
- unordered_map<类型,布尔值>与设置<TYPE>值
- 使用布尔值在c++中设置2d数组的值