何时使用 STL 位集而不是单独的变量?
Posted
技术标签:
【中文标题】何时使用 STL 位集而不是单独的变量?【英文标题】:When to use STL bitsets instead of separate variables? 【发布时间】:2010-09-06 10:53:42 【问题描述】:在什么情况下我更适合使用 bitset(STL 容器)来管理一组标志,而不是将它们声明为多个单独的(布尔)变量?
如果我对 50 个标志使用 bitset 而不是使用 50 个单独的 bool 变量,我会获得显着的性能提升吗?
【问题讨论】:
【参考方案1】:嗯,50 个布尔值作为一个位集将占用 7 个字节,而 50 个布尔值作为一个布尔值将占用 50 个字节。现在这没什么大不了的,所以使用 bool 可能没问题。
然而,位集可能有用的一个地方是,如果您需要大量传递这些布尔值,尤其是当您需要从函数返回集合时。使用位集,您需要在堆栈上移动以进行返回的数据更少。再说一次,你可以只使用 refs 来传递更少的数据。 :)
【讨论】:
在单独的 bool 情况下,您可以使用 bit field 来不浪费 50 个字节。【参考方案2】:std::bitset 在您需要序列化/反序列化时会给您加分。您可以将其写入流或使用它从流中读取。但可以肯定的是,单独的布尔值会更快。毕竟,它们针对这种用途进行了优化,而 bitset 针对空间进行了优化,并且仍然涉及函数调用。它永远不会比单独的布尔值更快。
位集
非常节省空间 由于位摆弄,效率较低 使用op<<
和op>>
提供序列化/反序列化
所有位都打包在一起:您将把标志放在一个地方。
单独的布尔值
非常快 布尔值未打包在一起。他们将成为某个地方的成员。根据事实做出决定。我个人会使用std::bitset
来处理一些对性能不重要的问题,如果我只有几个布尔值(因此它很容易概览),或者如果我需要额外的性能,我会使用布尔值。
【讨论】:
我将添加使用按位或运算符组合标志集的功能,作为 bitset 的巨大胜利。【参考方案3】:这取决于您所说的“性能提升”是什么意思。如果您只需要其中的 50 个,并且您的内存不低,那么单独的 bool 几乎总是比 bitset 更好的选择。它们会占用更多内存,但布尔值会快得多。位集通常实现为整数数组(布尔值被打包到这些整数中)。因此,您的 bitset 中的前 32 个布尔值(位)将只占用一个 32 位 int,但要读取每个值,您必须先进行一些按位运算以屏蔽所有您不想要的值。例如。要读取 bitset 的第二位,您需要:
-
找到包含所需位的 int(在这种情况下,它是第一个 int)
Bitwise And that int with '2' (i.e. value & 0x02) to find if that bit is set
但是,如果内存是一个瓶颈,并且您有很多使用 bitset 的布尔值可能是有意义的(例如,如果您的目标平台是手机,或者它是非常繁忙的 Web 服务中的某个状态)
注意: bool 的 std::vector 通常具有使用 equivalent of a bitset 的特化,因此出于同样的原因,它会变得更小且更慢。因此,如果速度是个问题,最好使用 char(甚至 int)的向量,甚至只使用老式的 bool 数组。
【讨论】:
【参考方案4】:回复@Wilka:
实际上,C/C++ 以一种不需要您自己屏蔽的方式支持位集。我不记得确切的语法,但它是这样的:
struct MyBitset
bool firstOption:1;
bool secondOption:1;
bool thirdOption:1;
int fourBitNumber:4;
;
您可以通过使用点表示法来引用该结构中的任何值,并且会发生正确的事情:
MyBitset bits;
bits.firstOption = true;
bits.fourBitNumber = 2;
if(bits.thirdOption)
// Whatever!
您可以对事物使用任意位大小。生成的结构最多可以比您定义的数据大 7 位(其大小始终是存储您定义的数据所需的最小字节数)。
【讨论】:
以上是关于何时使用 STL 位集而不是单独的变量?的主要内容,如果未能解决你的问题,请参考以下文章