[C ++ UE4-bool vs. uint8:1 vs. uint32:1-每个优缺点?

问题描述 投票:0回答:1

所以,我熟悉使用整数内部的单个位打包一堆布尔值的概念(我认为它称为位掩码),因此您可以节省内存,因为布尔是一个字节并且您更适合一个字节长的整数中的一个布尔值。因此,如果您有足够的布尔值,将它们打包在一起会有很大的不同,并且我们看到在本地Unreal源代码中,这种特定的优化被大量使用。但是我不清楚的是,它的缺点是什么?在某些地方使用许多常规布尔值来代替。另外,为什么要在一定程度上使用uint32并在某些地方使用unint8?我读过,可能有一些与读写相关的效率低下之类的东西?基本上,我有点理解,但并不完全。所以请ELI5-如果可以的话,再给我一个更复杂的解释。提前致谢。我是一个相当不错的程序员,但是我的经验和某些领域的教育不足。我自学了很多,但是我的知识仍然有些不足。感谢您在这里帮助教人!长期潜伏,第一次张贴。

c++ integer boolean unreal-engine4 bitmask
1个回答
0
投票

[最大的问题是,没有指向“ packed bool”的指针-就像您有一个int32包含32个布尔值,因此您无法使bool*bool&正确引用它们中的任何一个。这是因为字节是最小的存储单元。

在STL中,他们制作的std::vector<bool>节省了空间,并且在语义上与其他向量具有相同的接口。为此,他们必须制作一个从operator []返回的特殊代理类,因此需要执行boolVec[5] = true这样的操作。不幸的是,这种过度复杂化导致std::vector<bool>的性能和使用出现许多问题。

即使是关于打包布尔值的简单指令也往往是复合的,因此比通过bool表示的布尔值占用整个字节的情况更重。另外,修改压缩布尔值可能会导致多线程环境中的数据竞争。

基本上,硬件根本不能很好地支持布尔值。

接下来,是OS设计器的图像POV,您将创建共享库(又名dll)的通用接口。现在如何治疗布尔值?字节是最小的存储单元,因此要传递单个布尔值,仍然需要至少使用一个字节。那么,为什么不简单地忘记bool的存在并通过一个字节简单地传递它呢?因此,我们甚至不需要实现这种不必要的布尔类型,它将为所有语言的所有编译器编写者节省大量时间。

[uint8 vs uint32;另外,请注意,Windows的COM(组件对象模型-非串行端口)使用int16作为布尔值。通常,从本质上来说并不重要,因为当将值传递给共享库的函数时,执行复杂的操作不会在性能上产生任何明显的差异,因为您已经在调用更重的函数。还是为什么呢?我想他们很早以前就已经设计了某些原因,每个人都已经忘记了原因,他们只是保持不变,因为更改它会导致向后兼容,这完全是灾难。

在C99中,_Bool是为布尔值引入的,但这只是一个无符号int的不同名称。我想象从uint32的布尔用法开始。通常,就性能而言,int可能是最高效的整数类型(这就是为什么未严格定义其大小的原因)-因此C委员会选择了所谓的最有效的类型来表示布尔值。

© www.soinside.com 2019 - 2024. All rights reserved.