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

Is it possible to improve code performance by using reserve() before moving a vector with a bigger size into a vector with a smaller capacity?

本文关键字:向量 Reserve 可以通过 性能 代码 是否 高代码 移动 容量      更新时间:2023-10-16

对不起,如果这个问题非常不完整,不清楚或重复(这是我的第一个问题(。在研究"移动语义"并为我的OOP课程进行小型项目时,我偶然发现了一个我无法回答自己的问题。据我所知,std :: move((通过将l值转换为r值来起作用,但是让我们假设我们正在将带有很多元素的向量移动到具有1.的第二个矢量。我可以使用储备金(我可以使用储备金(( 避免 第二个向量的大量自动内存重新分配或使用Reserve((是否由于std :: move((将R值移动到第二个向量而没有效果?可以在下面找到我问题的简单实现。

#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;
}

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

矢量确实可以由3个指针(或两个指针和一个偏移量,一个指针和两个指针和两个偏移...但是这些都不常见,所以对于我的其余解释,我会想象向量是由三个指针代表(。

  1. 一个指针指向它管理的内存的开始。
  2. 一个指针指向已插入的项目的一端。
  3. 一个指针指向它管理的内存的一端。

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

实际上,这就是gcc这样做的方式(以及大多数标准库实现...但是我有gcc源方便(。请参阅此处。

因此,您的reserve调用充其量是由编译器优化为NO-OP的,并且最坏的情况正在导致不必要的内存分配。不好!

请看一下这篇文章:stl vector:移动向量的所有元素

std::move()O(1)解决方案。当您在向量上使用ITH时,移动的向量现在为空,而新的矢量具有移动一个元素。在这种情况下,reserve()方法将没有任何作用(但在其他情况下非常有用(。

您可以使用std::swap()方法,这也是一种不需要使用reserve()方法的方法。