c++ - 在将大小较大的 vector move 到容量较小的 vector 之前,是否可以通过使用 reserve() 来提高代码性能?

标签 c++ vector move

如果这个问题不完整、不清楚或重复(这是我的第一个问题),请提前道歉。在研究 move 语义和为我的 OOP 类(class)做一个小项目时,我偶然发现了一个我自己无法回答的问题。据我所知 std::move() 通过将 l 值转换为 r 值来工作,但假设我们将一个包含很多元素的 vector move 到容量为 1 的第二个 vector 中。我可以使用 reserve( ) 避免 由于 std::move() 将 r 值 move 到第二个 vector 中,第二个 vector 的大量自动内存重新分配或者使用 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;
}

最佳答案

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

一个 vector 实际上可以用 3 个指针(或两个指针和一个偏移量,或一个指针和两个偏移量......用三个指针表示)。

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

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

其实是这样的gcc做到这一点(和大多数标准库实现......但我手头有 gcc 源代码)。参见 here .

所以你的 reserve调用充其量被编译器优化为无操作,最坏的情况是导致不必要的内存分配。不好!

关于c++ - 在将大小较大的 vector move 到容量较小的 vector 之前,是否可以通过使用 reserve() 来提高代码性能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55915528/

相关文章:

c++ - 如何使用 ShellExecuteEx 确保 exe 启动

c++ - 编译 g++ 时出现错误消息

c++ - 区间 C++ 中的数字

javascript - 使用javascript在dom树中将元素向上或向下 move 一位

applescript - OS X 10.9 Applescript 更改 : using the `move` command in the "System Events" context to move a file

c++ - 信号 : Segmentation fault (11) when using Openmpi

C++ vector 语法错误

c++ - 获取 vector 中所有元素的某个组件

file - 如何使用远程系统上的 Ansible 任务 move/重命名文件

c++ - 函数局部变量在函数调用之间持续存在