何时使用STL位集代替单独的变量?

时间:2020-03-05 18:41:42  来源:igfitidea点击:

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

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

解决方案

回答

好吧,作为布尔集的50个布尔将占用7个字节,而作为布尔的50个布尔将占用50个字节。如今,这已不是什么大不了的事,因此使用bool可能没问题。

但是,位集可能有用的一个地方是,如果我们需要大量传递这些布尔值,特别是如果我们需要从函数返回集的话。使用位集,我们需要在堆栈上移动的数据较少,可以退回。再说一次,我们可以只使用refs,甚至传递更少的数据。 :)

回答

这取决于我们所说的"性能提升"。如果我们只需要其中的50个,并且内存并不低,那么单独的布尔值通常总是比bitset更好的选择。它们将占用更多的内存,但是速度更快。通常将位集实现为一个整数数组(布尔值包装在这些整数中)。因此,位集中的前32个布尔(位)将仅占用一个32位int,但是要读取每个值,我们必须先进行一些按位运算以掩盖所有不需要的值。例如。要读取位集的第二位,我们需要:

  • 查找包含所需位的int(在这种情况下,它是第一个int)
  • 按位然后将int设置为'2'(即value&0x02)以了解是否设置了该位

但是,如果内存是瓶颈,并且我们有很多问题,使用位集可能是有道理的(例如,如果目标平台是手机,或者处于非常繁忙的Web服务中处于某种状态)

注意:bool的std :: vector通常具有使用位集等效项的专门知识,因此由于相同的原因,它会更小且也更慢。因此,如果速度是一个问题,那么最好使用char(甚至int)向量,甚至只使用老式的布尔数组。

回答

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

回答

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

位集

  • 节省空间
  • 由于位摆弄而效率较低
  • 提供使用op <<op >>进行序列化/反序列化
  • 所有位打包在一起:我们将标志放在一个位置。

单独的布尔

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

决定事实。就我个人而言,我会使用" std :: bitset"来处理一些对性能没有严格要求的事情,如果我或者只有几个布尔值(因此它是可以大致概述的),或者如果我需要额外的性能,就使用布尔值。