2013-04-04 135 views
8

我正在使用memcpy将std:vectors <>的内容复制到primitve Arrays。对于像int,float,double等数据类型,它运行良好。当我开始复制一个boolvector时,我遇到了一个问题,即我得到了奇怪的值。为什么“std :: vector <bool>”16字节的大小?

首先,我开始做一个矢量浮点的测试输出:

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字节。当我这样做对布尔输出看起来是这样的:

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 

为什么是布尔16字节的大小?这对我来说似乎是一种矫枉过正。有解释吗?

+1

'&test [0]'不是你认为的那样。检查它的类型! – 2013-04-04 10:57:16

+2

您的标题有误导性,您从未真正检查过'std :: vector '的尺寸。 – jrok 2013-04-04 10:58:04

+0

你不能把'sizeof'的东西比一个字符小。 'sizeof'运算符以字符大小的整数倍返回大小。 – 2013-04-04 10:59:59

回答

18

不像vector其他特,vector<bool>不管理bool对象的动态数组。相反,它应该将布尔值分别打包到一个位中。

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

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

+0

谢谢。你的接受者清晰易懂! – akristmann 2013-04-04 11:13:14

+1

@akristmann你也可以看一下http://en.cppreference.com/w/cpp/utility/bitset,它可能适合你。 – 2013-04-04 15:02:58

4

std::vector<bool>是矢量的专门版本,它对空间进行了优化。

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

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

相关问题