Zeb*_*ish 28 c++ arrays casting boolean
有一个类似的问题在这里,但在这一问题的用户似乎有一个更大的阵列,或载体。如果我有:
bool boolArray[4];
Run Code Online (Sandbox Code Playgroud)
我想检查所有元素是否为假,我可以分别检查[0],[1],[2]和[3],也可以循环遍历。由于(据我所知)false应该具有值0,而除0以外的其他任何东西都为true,所以我想到了简单地做:
if ( *(int*) boolArray) { }
Run Code Online (Sandbox Code Playgroud)
这行得通,但是我意识到它依赖于布尔值是一个字节,整数是四个字节。如果我强制转换为(std :: uint32_t)可以,还是一个坏主意?我刚好在一个数组中有3或4个布尔值,并且想知道这是否安全,如果不是,那么是否有更好的方法可以做到。
另外,如果我最终得到超过4个布尔值,但少于8个布尔值,那么我可以使用std :: uint64_t或unsigned long long之类的东西做同样的事情吗?
Yks*_*nen 21
作为????? ??? 在评论中注意到,std::bitset这可能是无UB方式处理该问题的最佳方法。
std::bitset<4> boolArray {};
if(boolArray.any()) {
//do the thing
}
Run Code Online (Sandbox Code Playgroud)
如果您要坚持使用数组,可以使用std::any_of,但这需要(可能是读者所特有的)用法functor,它仅返回其参数:
bool boolArray[4];
if(std::any_of(std::begin(boolArray), std::end(boolArray), [](bool b){return b;}) {
//do the thing
}
Run Code Online (Sandbox Code Playgroud)
对4 bool进行类型调整int可能不是一个好主意-您不能确定每种类型的大小。它可能可以在大多数体系结构上运行,但是std::bitset可以保证在任何情况下都可以在任何地方运行。
几个答案已经解释了好的选择,尤其是std::bitset和std::any_of()。我写单独指出的是,除非你知道我们不这样做的东西,它是不是安全之间键入双关语bool,并int以这种方式,有以下几个原因:
int 正如多个答案指出的那样,它可能不是四个字节。bool可能不是一个字节。我不知道这种情况曾经发生过的任何现实世界的体系结构,但是仍然是规范性的。它(可能)不能小于一个字节,除非编译器使用其内存模型进行一些非常精心的隐藏球装饰,而且多字节的布尔值似乎毫无用处。但是请注意,字节不必首先是8位。int可以有陷阱表示。也就是说,将某些位模式转换为时,导致未定义的行为是合法的int。这在现代体系结构上很少见,但可能出现在(例如)ia64或任何带符号零的系统上。您应该使用其他答案提供的替代解决方案之一。
*重用boolArray通过将其强制转换为int并存储一个整数所指向的内存是合法的(具有某些条件,特别是关于对齐),尽管如果您确实要这样做,那么如果要读取该内存则必须boolArray通过std::launder导致int稍后。无论如何,即使您不调用洗涤程序,编译器有权在看到读取内容后就假定您已完成此操作。
| 归档时间: |
|
| 查看次数: |
2625 次 |
| 最近记录: |