何时使用 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 位集而不是单独的变量?的主要内容,如果未能解决你的问题,请参考以下文章

Mahout 0.9:使用自己的测试集而不是使用拆分命令

加载多个数据集而不覆盖变量

将字节数组转换为位集

MS ACCESS:打印基于记录集而不是 record_ID 的报告

完整数据集而不是 Top 1000 EF Core

对指针的引用如何在C ++中完全起作用,以及何时需要它们(在链表的情况下)