为什么"std :: vector <bool>"的大小是16字节?

akr*_*ann 9 c++ boolean vector

我正在使用memcpy将std:vectors <>的内容复制到primitve Arrays.对于像int,float,double等数据类型,它运行良好.当我开始复制一个boolvector时,我遇到了一个问题,即我得到了奇怪的值.

首先,我开始为浮动矢量进行测试输出:

std::vector<float> test1 (3,0);

cout << "Sizeof test1[0] : " << sizeof(test1[0]) << endl
     << "Memoryaddress 0: " << &test1[0] << endl
     << "Memoryaddress 1: " << &test1[1] << endl
     << "Memoryaddress 2: " << &test1[2] << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

Sizeof test1[0]: 4
Memoryaddress 0: 02793820
Memoryaddress 1: 02793824
Memoryaddress 2: 02793828
Run Code Online (Sandbox Code Playgroud)

这就是我的期望.浮点大小为4字节,到下一个浮点值的距离为4字节.当我为bool执行此操作时,输出如下所示:

std::vector<bool> test (3,0);

cout << "Sizeof test[0]: " << sizeof(test[0]) << endl
     << "Memoryaddress 0: " << &test[0] << endl
     << "Memoryaddress 1: " << &test[1] << endl
     << "Memoryaddress 2: " << &test[2] << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

Sizeof test[0]: 16
Memoryaddress 0: 011EF94C
Memoryaddress 1: 011EF93C
Memoryaddress 2: 011EF92C
Run Code Online (Sandbox Code Playgroud)

为什么bool 16 Byte的大小?这对我来说似乎是一种矫枉过正.对此有解释吗?

Mik*_*our 23

与其他专业化不同vector,vector<bool>不管理动态bool对象数组.相反,它应该将布尔值分别打包成一个比特.

由于各个位不可寻址,test[0]因此不能简单地作为参考bool.相反,它是一种类型vector<bool>::reference,可以转换为bool(获取值),并从中分配bool(以修改向量元素).

这意味着它vector<bool>不完全满足标准容器的要求,并且如果您需要对其元素的引用或指针,则不能使用它.如果您确实需要具有可寻址元素的"真实"容器,请考虑vector<char>deque<bool>改为.