【问题标题】:Why is the size of "std::vector<bool>" 16 Byte?为什么“std::vector<bool>”的大小是 16 字节?
【发布时间】:2013-03-26 09:45:09
【问题描述】:

我正在使用 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?对我来说,这似乎完全是矫枉过正。对此有解释吗?

【问题讨论】:

  • &amp;test[0] 不是你想象的那样。检查它的类型!
  • 您的标题具有误导性,您从未真正检查过std::vector&lt;bool&gt; 的大小。
  • 您不能使用小于一个字符的sizeofsizeof 运算符以字符大小的整数倍返回大小。
  • @DavidSchwartz:是的,但这并不能解释为什么它是 16 个字节而不是 1 个。
  • @DavidSchwartz:除非假设test[0] 是对bool 的引用,就像test1[0] 是对float 的引用一样——如果你不知道,这是一个相当合理的假设关于vector&lt;bool&gt; 专业化。 bool 本身并不是“小于一个字符”,如果大于这个值,会让人感到惊讶。

标签: c++ vector boolean


【解决方案1】:

vector 的其他特化不同,vector&lt;bool&gt; 不管理bool 对象的动态数组。相反,它应该将布尔值打包成一个位。

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

这意味着vector&lt;bool&gt; 不完全满足标准容器的要求,如果您需要对其元素的引用或指针,则无法使用。如果您确实需要具有可寻址元素的“真实”容器,请考虑使用vector&lt;char&gt;deque&lt;bool&gt;

【讨论】:

【解决方案2】:

std::vector&lt;bool&gt; 是向量的特殊版本,它针对空间进行了优化。

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

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

【讨论】:

    猜你喜欢
    • 2018-02-17
    • 1970-01-01
    • 2020-12-20
    • 2011-01-25
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    相关资源
    最近更新 更多