位字段与Bitset

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将您的位数组包装在具有许多有用操作的漂亮对象表示中.


Che*_*Alf 6

一个很好的选择取决于你将如何使用这些位.

std::bitset<N>具有固定的大小.Visual C++ 10.0是不符合的wrt.建设者; 一般来说,你必须提供一种解决方法.具有讽刺意味的是,这是因为微软认为这是一个错误修复 - 他int回忆说,他们引入了一个构造函数.

std::vector<bool>优化方式与std::bitset.成本:索引不直接提供引用(C++中没有对单个位的引用),而是返回一个代理对象 - 在您尝试将其用作引用之前,这不是您注意到的.优点:存储空间最小,矢量可根据需要调整大小.

unsigned如果您要处理少量的比特(实际上,32或更少,虽然正式保证只有16位),简单地使用eg 也是一种选择.

最后,所有UPPERCASE标识符按照惯例(Microsoft除外)为宏保留,以减少名称冲突的可能性.因此,不要将所有大写标识符用于除宏以外的任何其他内容,这是一个好主意.并始终使用宏的所有大写标识符(这也使它更容易识别它们).

干杯&hth.,