gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:34:31 26 4
gpt4 key购买 nike

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

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

为什么可以将指针指向 bool 的数组?不退吗?

最佳答案

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

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

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

enter image description here

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

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

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

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

What are the benefits in not doing so?

内存优化。

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

关于c++ - 为什么 std::vector<bool> 没有 .data()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46115669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com