【发布时间】:2018-05-25 18:06:48
【问题描述】:
我正在学习位标志和使用位运算符手动创建位字段。然后我遇到了位集,这似乎是一种更简单、更清洁的存储位字段的方法。我理解使用位字段的价值,以尽量减少内存使用。但是,在测试 sizeof(bitset) 之后,我很难理解这是一种更好的方法。
考虑:
#include <bitset>
#include <iostream>
int main ()
{
// Using Bit Set, Size = 8 Bytes
const unsigned int i1 = 0;
const unsigned int i2 = 1;
std::bitset<8> mySet(0);
mySet.set(i1);
mySet.set(i2);
std::cout << sizeof(mySet) << std::endl;
// Manually managing bit flags
const unsigned char t1 = 1 << 0;
const unsigned char t2 = 1 << 1;
unsigned char bitField = 0;
bitField |= t1 | t2;
std::cout << sizeof(bitField) << std::endl;
return 0;
}
输出是:
mySet 是 8 个字节。 bitField 为 1 个字节。
如果需要最少的内存使用,我应该不使用 std::bitset 吗?
【问题讨论】:
-
bitset具有与unsigned long long之间的转换,因此在内部存储该类型并非不合理。如果您需要bitset<1000>,该类型也更方便。如果您只需要一些位,无符号字符可能会更好。 -
Bo,您是说在处理大量要管理的位时,bitset 会得到回报吗?但是为了尽量减少内存使用,我应该坚持手动位移吗?
-
如果你使用很少的位并且最小的空间比现成的类的便利性更重要,那么可以。一些编译器可能会优化小
bitset的大小,但不是所有人。 -
@LoganWest -- 好吧,你真的不能指望一个有成员的类的大小是一个字节。
标签: c++ bit-fields std-bitset