在什么情况下我更适合使用 bitset(STL 容器)来管理一组标志,而不是将它们声明为多个单独的(布尔)变量?
如果我对 50 个标志使用 bitset 而不是使用 50 个单独的 bool 变量,我会获得显着的性能提升吗?
在什么情况下我更适合使用 bitset(STL 容器)来管理一组标志,而不是将它们声明为多个单独的(布尔)变量?
如果我对 50 个标志使用 bitset 而不是使用 50 个单独的 bool 变量,我会获得显着的性能提升吗?
好吧,作为 bitset 的 50 个布尔值将占用 7 个字节,而作为布尔值的 50 个布尔值将占用 50 个字节。现在这并不是什么大问题,所以使用 bools 可能没问题。
但是,如果您需要大量传递这些布尔值,尤其是当您需要从函数返回集合时,位集可能有用的一个地方。使用位集,您需要在堆栈上移动以返回的数据更少。再说一次,你可以只使用 refs 来传递更少的数据。:)
当您需要对其进行序列化/反序列化时,std::bitset 会给您加分。您可以将其写入流或使用它从流中读取。但可以肯定的是,单独的布尔值会更快。毕竟它们针对这种用途进行了优化,而位集针对空间进行了优化,并且仍然涉及函数调用。它永远不会比单独的布尔值更快。
op<<
和op>>
根据事实决定。我个人会使用std::bitset
一些非性能关键,如果我只有几个布尔值(因此它很容易概览),或者如果我需要额外的性能,我会使用布尔值。
这取决于您所说的“性能增益”是什么意思。如果您只需要其中的 50 个,并且您的内存不低,那么单独的 bool 几乎总是比 bitset 更好的选择。它们会占用更多内存,但布尔值会快得多。位集通常实现为整数数组(布尔值被打包到这些整数中)。因此,您的 bitset 中的前 32 个布尔值(位)将只占用一个 32 位 int,但要读取每个值,您必须先进行一些按位运算以屏蔽所有您不想要的值。例如,要读取 bitset 的第二位,您需要:
但是,如果内存是一个瓶颈并且您有很多使用 bitset 的布尔值可能是有意义的(例如,如果您的目标平台是手机,或者它是非常繁忙的 Web 服务中的某种状态)
注意: bool 的 std::vector 通常具有使用等效位集的特化,因此由于相同的原因使其更小且更慢。因此,如果速度是一个问题,最好使用 char (甚至 int)向量,或者甚至只使用老式的 bool 数组。
回复@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 位(其大小始终是存储您定义的数据所需的最小字节数)。