16

在什么情况下我更适合使用 bitset(STL 容器)来管理一组标志,而不是将它们声明为多个单独的(布尔)变量?

如果我对 50 个标志使用 bitset 而不是使用 50 个单独的 bool 变量,我会获得显着的性能提升吗?

4

4 回答 4

10

好吧,作为 bitset 的 50 个布尔值将占用 7 个字节,而作为布尔值的 50 个布尔值将占用 50 个字节。现在这并不是什么大问题,所以使用 bools 可能没问题。

但是,如果您需要大量传递这些布尔值,尤其是当您需要从函数返回集合时,位集可能有用的一个地方。使用位集,您需要在堆栈上移动以返回的数据更少。再说一次,你可以只使用 refs 来传递更少的数据。:)

于 2008-08-21T19:05:30.763 回答
9

当您需要对其进行序列化/反序列化时,std::bitset 会给您加分。您可以将其写入流或使用它从流中读取。但可以肯定的是,单独的布尔值会更快。毕竟它们针对这种用途进行了优化,而位集针对空间进行了优化,并且仍然涉及函数调用。它永远不会比单独的布尔值更快。

位组

  • 非常节省空间
  • 由于位摆弄效率较低
  • 提供序列化/反序列化op<<op>>
  • 所有位都打包在一起:您将在一个地方拥有标志。

单独的布尔值

  • 非常快
  • 布尔值没有打包在一起。他们将成为某个地方的成员。

根据事实决定。我个人会使用std::bitset一些非性能关键,如果我只有几个布尔值(因此它很容易概览),或者如果我需要额外的性能,我会使用布尔值。

于 2008-11-19T04:32:19.037 回答
4

这取决于您所说的“性能增益”是什么意思。如果您只需要其中的 50 个,并且您的内存不低,那么单独的 bool 几乎总是比 bitset 更好的选择。它们会占用更多内存,但布尔值会快得多。位集通常实现为整数数组(布尔值被打包到这些整数中)。因此,您的 bitset 中的前 32 个布尔值(位)将只占用一个 32 位 int,但要读取每个值,您必须先进行一些按位运算以屏蔽所有您不想要的值。例如,要读取 bitset 的第二位,您需要:

  1. 找到包含您想要的位的 int(在这种情况下,它是第一个 int)
  2. Bitwise And that int with '2' (ie value & 0x02) 找出该位是否已设置

但是,如果内存是一个瓶颈并且您有很多使用 bitset 的布尔值可能是有意义的(例如,如果您的目标平台是手机,或者它是非常繁忙的 Web 服务中的某种状态)

注意: bool 的 std::vector 通常具有使用等效位集的特化,因此由于相同的原因使其更小且更慢。因此,如果速度是一个问题,最好使用 char (甚至 int)向量,或者甚至只使用老式的 bool 数组。

于 2008-08-21T19:21:03.240 回答
3

回复@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 位(其大小始终是存储您定义的数据所需的最小字节数)。

于 2008-08-21T19:35:54.827 回答