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

Why does std::vector<bool> have no .data()?

std::vector<bool> 的特化,如 C++11 23.3.7/1 中所指定,未声明 [​​=13=] 成员(例如提到的 here and )。

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

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

Why does a std::vector have no .data()?

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

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

假设你想索引一个块来获取一个值,你会如何使用运算符[]?它不能 return bool&(因为它会 return 一个字节,存储不止一个 bools),因此你不能分配一个 bool*给它。换句话说 bool *bool_ptr =&v[0]; 不是 有效代码,并且会导致编译错误。

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

Why can a pointer to an array of bools not be returned?

因为 std::vector<bool> 不是 存储为布尔数组,因此不能直接 returned 指针。它可以通过将数据复制到一个数组和 return 该数组来做到这一点,但不这样做是一种设计选择(如果他们这样做,我认为这对所有容器都有效 data() ,这会产生误导)。

What are the benefits in not doing so?

内存优化。

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