为什么“的std ::向量的大小 ” 16字节?(Why is the size of “st

2019-08-19 11:39发布

我使用的memcpy到STD的内容复制:矢量<>到primitve阵列。 对于像整数,浮点,双等数据类型,效果不错。 当我开始复制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;

输出是:

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字节的大小? 这似乎是一个总矫枉过正给我。 是否有这样的解释?

Answer 1:

不像其他特vectorvector<bool>不管理的一个动态数组bool对象。 相反,它应该是布尔值打包到每一个单个位。

因为各个位是不可寻址, test[0]不能简单地与参考bool 。 相反,它是一个类类型vector<bool>::reference可以转换到bool (获取的值),并从分配的bool (修改矢量元素)。

这意味着vector<bool>没有完全满足标准容器的要求,并不能用于如果需要引用或指针到它的元件。 如果您确实需要与寻址元件“真正的”集装箱,考虑vector<char>deque<bool>代替。



Answer 2:

std::vector<bool>是载体的一个专门的版本,这是用于空间优化。

  • 存储不一定是布尔值的阵列,但是,使每个值存储在一个单个位库实现可以优化存储。
  • 元件使用分配器对象不构成,但是它们的值被直接设置在所述内部存储器中的适当的位。

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



文章来源: Why is the size of “std::vector” 16 Byte?