在什么情况下,使用bitset(STL容器)来管理一组标志而不是将它们声明为多个单独的(bool)变量更合适?
如果我使用50位标志的bitset而不是使用50个单独的bool变量,我会获得显着的性能提升吗?
答案 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>>
决定事实。我个人会使用std::bitset
来表示一些非性能关键,并且如果我只有少量bool(因此它具有相当概要性),或者如果我需要额外的性能,则会使用bool。
答案 2 :(得分:3)
这取决于你的“绩效收益”是什么意思。如果你只需要其中的50个,并且你的记忆力不低,那么单独的bool几乎总是比bitset更好的选择。他们会留下更多的记忆,但是布尔会更快。 bitset通常被实现为一个int数组(bool被打包到那些int中)。所以你的bitset中的前32位bools(位)只占用一个32位int,但要读取每个值,你必须先做一些按位操作,以掩盖你不想要的所有值。例如。要读取位集的第2位,您需要:
然而,如果内存是一个瓶颈而且你有很多使用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位(其大小始终是存储您定义的数据所需的最小字节数)。