20

的特化std::vector<bool>,如 C++11 23.3.7/1 中所指定,不声明成员(例如,在此处此处data()提到)。

问题是:为什么 astd::vector<bool>没有.data()?这与为什么bools 的向量没有连续存储在内存中是同一个问题。不这样做有什么好处?

为什么不能返回指向 s 数组的指针bool

4

1 回答 1

33

为什么 std::vector 没有 .data()?

因为std::vector<bool>在 1 个字节中存储多个值。

把它想象成一个压缩存储系统,其中每个布尔值都需要 1 位。因此,不是每个内存块有一个元素(每个数组单元一个元素),内存布局可能如下所示:

在此处输入图像描述

假设你想索引一个块来获取一个值,你将如何使用 operator []?它无法返回bool&(因为它将返回一个字节,其中存储多个bools),因此您无法为其分配 a bool*。换句话说bool *bool_ptr =&v[0];不是有效的代码,并且会导致编译错误。

此外,正确的实现可能没有那种专业化并且不进行内存优化(压缩)。因此data()必须根据实现复制到预期的返回类型(或标准应该强制优化而不是仅仅允许它)。

为什么不能返回指向布尔数组的指针?

因为std::vector<bool>不存储为布尔数组,因此不能以直接的方式返回指针它可以通过将数据复制到数组并返回该数组来做到这一点,但不这样做是一种设计选择(如果他们这样做了,我认为这适用data()于所有容器,这会产生误导)。

不这样做有什么好处?

内存优化。

通常内存使用量减少 8 倍,因为它在单个字节中存储多个位。准确地说,CHAR_BIT时间少了。

于 2017-09-08T11:42:36.407 回答