13

我正在使用 memcpy 将 std:vectors<> 的内容复制到原始数组。对于 int、float、double 等数据类型,它运行良好。当我开始复制一个布尔向量时,我遇到了一个问题,即我得到了奇怪的值。

首先,我开始为浮点向量制作测试输出:

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;

输出是:

Sizeof test1[0]: 4
Memoryaddress 0: 02793820
Memoryaddress 1: 02793824
Memoryaddress 2: 02793828

这就是我所期望的。浮点大小为 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;

输出是:

Sizeof test[0]: 16
Memoryaddress 0: 011EF94C
Memoryaddress 1: 011EF93C
Memoryaddress 2: 011EF92C

为什么 bool 的大小是 16 Byte?对我来说,这似乎完全是矫枉过正。对此有解释吗?

4

2 回答 2

28

与 的其他特化不同vectorvector<bool>它不管理bool对象的动态数组。相反,它应该将布尔值打包成一个位。

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

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

于 2013-04-04T11:01:19.397 回答
4

std::vector<bool>是向量的特殊版本,针对空间进行了优化。

  • 存储不一定是 bool 值的数组,但库实现可以优化存储,以便每个值都存储在单个位中。
  • 元素不是使用分配器对象构造的,但它们的值直接设置在内部存储的适当位上。

更多信息:http ://www.cplusplus.com/reference/vector/vector-bool/

于 2013-04-04T10:58:11.963 回答