CLO*_*OWN 17 c++ bitset bit-fields
我想在数组中存储位(如结构).所以我可以遵循以下两种方法之一
方法1(AN 1)
struct BIT
{
int data : 1
};
int main()
{
BIT a[100];
return 0;
}
Run Code Online (Sandbox Code Playgroud)
方法2(AN 2)
int main()
{
std::bitset<100> BITS;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么有人比AN 1更喜欢AN 2?
Fre*_*Foo 19
因为接近nr.2实际上使用100位存储,加上一些非常小的(恒定的)开销,而nr.1通常每个Bit结构使用四个字节的存储空间.通常,struct每个C++标准a 至少有一个字节.
#include <bitset>
#include <iostream>
struct Bit { int data : 1; };
int main()
{
Bit a[100];
std::bitset<100> b;
std::cout << sizeof(a) << "\n";
std::cout << sizeof(b) << "\n";
}
Run Code Online (Sandbox Code Playgroud)
版画
400
16
Run Code Online (Sandbox Code Playgroud)
除此之外,bitset将您的位数组包装在具有许多有用操作的漂亮对象表示中.
一个很好的选择取决于你将如何使用这些位.
std::bitset<N>具有固定的大小.Visual C++ 10.0是不符合的wrt.建设者; 一般来说,你必须提供一种解决方法.具有讽刺意味的是,这是因为微软认为这是一个错误修复 - 他int回忆说,他们引入了一个构造函数.
std::vector<bool>优化方式与std::bitset.成本:索引不直接提供引用(C++中没有对单个位的引用),而是返回一个代理对象 - 在您尝试将其用作引用之前,这不是您注意到的.优点:存储空间最小,矢量可根据需要调整大小.
unsigned如果您要处理少量的比特(实际上,32或更少,虽然正式保证只有16位),简单地使用eg 也是一种选择.
最后,所有UPPERCASE标识符按照惯例(Microsoft除外)为宏保留,以减少名称冲突的可能性.因此,不要将所有大写标识符用于除宏以外的任何其他内容,这是一个好主意.并始终使用宏的所有大写标识符(这也使它更容易识别它们).
干杯&hth.,