的特化std::vector<bool>
,如 C++11 23.3.7/1 中所指定,不声明成员(例如,在此处和此处data()
提到)。
问题是:为什么 astd::vector<bool>
没有.data()
?这与为什么bool
s 的向量没有连续存储在内存中是同一个问题。不这样做有什么好处?
为什么不能返回指向 s 数组的指针bool
?
为什么 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
时间少了。