为什么 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
倍。
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
倍。