何时使用STL位集而不是单独的变量?

时间:2008-08-21 18:58:00

标签: c++ performance bitsets

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

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

4 个答案:

答案 0 :(得分:10)

好吧,作为bitset的50个bool将占用7个字节,而作为bool的50个bool将占用50个字节。这些日子并不是什么大问题,所以使用bool可能没问题。

但是,一个bitset可能有用的地方是你需要经常传递那些bool,特别是如果你需要从函数返回set。使用bitset,您需要在堆栈上移动返回的数据更少。然后,你可以改为使用refs,并传递更少的数据。 :)

答案 1 :(得分:9)

当你需要序列化/反序列化时,

std :: bitset会给你额外的分数。您可以将其写入流或使用它从流中读取。但当然,单独的bools会更快。毕竟,它们针对这种用途进行了优化,而bitset则针对空间进行了优化,并且仍然涉及到函数调用。它永远不会比单独的bool更快。

比特集

  • 非常节省空间
  • 由于比特摆弄而效率低下
  • 使用op<<op>>
  • 提供序列化/反序列化
  • 所有比特打包在一起:你将在一个地方拥有旗帜。

单独布尔

  • 非常快
  • Bool没有包装在一起。他们将成为某个地方的成员。

决定事实。我个人会使用std::bitset来表示一些非性能关键,并且如果我只有少量bool(因此它具有相当概要性),或者如果我需要额外的性能,则会使用bool。

答案 2 :(得分:3)

这取决于你的“绩效收益”是什么意思。如果你只需要其中的50个,并且你的记忆力不低,那么单独的bool几乎总是比bitset更好的选择。他们会留下更多的记忆,但是布尔会更快。 bitset通常被实现为一个int数组(bool被打包到那些int中)。所以你的bitset中的前32位bools(位)只占用一个32位int,但要读取每个值,你必须先做一些按位操作,以掩盖你不想要的所有值。例如。要读取位集的第2位,您需要:

  1. 找到包含所需位的int(在本例中,它是第一个int)
  2. 按位和那个带'2'的int(即值&amp; 0x02)来确定该位是否已设置
  3. 然而,如果内存是一个瓶颈而且你有很多使用bitset的bool可能有意义(例如,如果你的目标平台是手机,或者它是一个非常繁忙的网络服务中的状态)

    注意:bool的std :: vector通常具有使用equivalent of a bitset的特化,因此由于相同的原因使其更小并且也更慢。因此,如果速度是一个问题,你最好使用char(或甚至int)向量,或者甚至只使用旧的bool数组。

答案 3 :(得分:3)

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

相关问题