在 C++ 中 move 在内存中发生了什么

what happens in memory for move in C++

我正在阅读 C++ 入门移动部分,对移动实现感到困惑。

假设我们有一个向量,它有 4 个元素,占据 4 个连续的内存位置。 内存[0~3]。 vector的容量为4.

假设 MEM[4] 现在不可用,因为它被另一个线程或程序占用或由于任何原因。这可能吗?

现在我们需要添加另一个元素。因为要维护连续内存,所以只能另找一块连续内存,可以容纳8个vector entry,比如MEM[5~12]。这样,我们确实是把MEM[0~3]的内容复制到MEM[5~8],然后在MEM[9]添加新的元素吧?

我们无法重用旧 MEM[0~3] 并在保持连续地址的同时增加容量。

如果是链表,我可以理解这一步。但是对于数组之类的,我有点困惑。请帮忙解释一下。谢谢。

这完全超出了 C++ 标准的范围。

标准中没有任何内容禁止这种优化。一个特定的 C++ 实现肯定有可能确定已经用完其 reserve()d 容量的 std::vector 可以扩展,而无需分配更大的存储空间并将向量的现有内容移动到更大的已分配存储空间中。

如果是这样,那么这是一个非常合理且明智的优化。但 C++ 标准中也没有任何内容需要这种特定的优化。鉴于 std::vector 的存储扩展算法已经规定生成的向量插入必须具有恒定的摊销时间复杂度,因此有理由得出这样的结论:跟踪内存分配到这种详细程度的额外复杂性可能只会产生边际收益,以换取更大的整体开销,并且实际上可能会产生更多的整体开销。