首页 > 解决方案 > 在 C++ 中移动的内存中会发生什么

问题描述

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

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

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

现在我们需要添加另一个元素。因为我们必须保持连续内存,所以只能找到另一块可以容纳8个向量条目的连续内存,例如MEM[5~12]。这样,我们确实将 MEM[0~3] 中的内容复制到 MEM[5~8] 中,然后在 MEM[9] 处添加新元素,对吗?

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

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

标签: c++move

解决方案


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

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

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


推荐阅读