在将较大尺寸的向量移动到容量较小的向量之前,是否可以通过使用reserve()来提高代码性能?

Min*_*lis 4 c++ move vector

如果这个问题还很不完整,不清楚或重复(这是我在这里的第一个问题),请提前抱歉。在研究移动语义并为OOP课程设计一个小项目时,我偶然发现了一个我自己无法回答的问题。据我所知,std :: move()通过将l值转换为r值来工作,但让我们假设我们将一个包含很多元素的向量移动到容量为1的第二向量中。我可以使用reserve( )以避免对第二个向量进行大量的自动内存重新分配,或者由于std :: move()将r值移动到第二个向量中而使用reserve()无效吗?我的问题的简单实现可以在下面找到。

#include <iostream>
#include <vector>
#include <algorithm>
int main() {
    std::vector<int> first (1000000);
    std::vector<int> second (1);
    std::fill(first.begin(),first.end(),7);
    second.reserve(1000000);//is this needed??
    second=std::move(first);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

dru*_*nly 5

不,这不是必需的,几乎可以肯定是过早的优化。

向量实际上可以由3个指针(或两个指针和一个偏移量,或一个指针和两个偏移量...表示),但是它们并不常见,因此在我的其余解释中,我将想象向量由三个指针表示指针)。

  1. 一个指针指向它管理的内存的开始。
  2. 一个指针指向插入其中的项目的最后一句。
  3. 一个指针指向它管理的内存的最后一点。

std::vector<int> a = std::move(b);可以通过仅从中获取这三个指针来实现move构造函数b,将它们设置为一些易于制作的值(nullptr例如,作为前哨值,表示“我为空”),然后一切都会完成。

实际上,这就是这样gcc做的方式(以及大多数标准库的实现方式,但是我gcc很方便地获得了源代码)。看这里

因此,您的reserve调用最多由编译器优化为无操作,最坏的情况是导致不必要的内存分配。不好!