2

我的理解std::span是它本质上包含指向容器的指针、大小和一些有用的成员函数。

template<typename T>
class SimpleSpan {
    T* ptr;
    size_t length;
    // some member functions
}

如this question所示,我可以采用一个向量的跨度。

如果我将条目添加到向量的末尾,则可能需要调整向量的大小。调整矢量大小时,会发生以下步骤(顺序不重要)。

  1. 在具有更多空间的堆上分配了一个新数组。

  2. 向量中的条目被移动到新数组中。

  3. 到's 数组ptr的成员更改为新数组的开头。vectorvector

  4. 旧数组被释放。

span如果vector' 的数组需要重新分配并变大,会发生什么情况吗?是否在未定义的行为上调用了spaninto a vectorafter ?push_backvector

4

2 回答 2

1

我对 std::span 的理解是它本质上包含指向容器的指针、大小和一些有用的成员函数。

不太正确。std::span完全忽略数据所在的位置。它只处理数据本身。属于容器的数据的性质(甚至概念)被完全抹去。它所关心的只是数据在内存中是连续的。

因此,如果一个向量曾经调整大小,这可能发生在push_back(). 数据可能被移动到不同的内存位置,从而使指向它的任何指针无效。这反过来又会使std::span对该数据的任何引用无效。

于 2021-10-20T15:59:48.780 回答
0

push_back有关读取的文档:

如果新的 size() 大于 capacity() 则所有迭代器和引用(包括过去的迭代器)都将失效。否则只有过去的迭代器无效。

那里有你的答案:如果必须调整向量的大小,你通过旧跨度的访问将是无效的。如果没有,就不会。

于 2021-10-20T16:08:34.767 回答