gpt4 book ai didi

c++ - 在 C++ 中是否需要 bool 表示在 true 时设置 1 位/在 false 时设置 0 位

转载 作者:太空狗 更新时间:2023-10-29 19:55:56 25 4
gpt4 key购买 nike

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

但我不知道标准是否保证 bool 表示为 true 时仅设置 1 位,为 false 时设置 0 位的数字。

如果答案是否定的,那么我有一个后续问题:如果不需要,是否要求表示是恒定的,例如如果我有一个测试来检查转换为 uint_8t 的 true bool 是否为 1(对于 false 为 0),这是否意味着程序中 bool 的每个表示都将表现相同。

注意:我知道不需要 bool 为 1 字节,但我可以对此进行 static_assert。

最佳答案

I was thinking about microoptimizing a function that returns 4 bools by using an union of uint32_t and bool[4], and then doing the popcnt instruction to see how many elements of the bool array are true.

这将导致未定义的行为,因为访问 union 体的非事件成员违反了对象生命周期规则。您可能想使用 std::bitset<4> 相反——它是为这样的用途而设计的。

请注意 std::bitset不能直接由多个 bool 构建s,你可能需要编写一个 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

( test )

But I do not know if the standard guarantees that bool is represented as number with only 1 bit set when true and 0 bits set when it is false.

不,没有那样的保证。 [basic.fundamental]/10 :

Type bool is a distinct type that has the same object representation, value representation, and alignment requirements as an implementation-defined unsigned integer type. The values of type bool are true and false. [ Note: There are no signed, unsigned, short, or long bool types or values. — end note ]

没有更多关于值表示的保证。

If the answer is no then I have a follow up question: if it is not required is it required that representation is constant, e.g. if I have a test that checks that true bool casted to uint_8t is 1(and 0 for false) does that this means that every representation of bools in the program will behave the same.

不,也没有这样的保证。

关于c++ - 在 C++ 中是否需要 bool 表示在 true 时设置 1 位/在 false 时设置 0 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57659209/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com