为什么std::移动速度比复制慢

Why is std:: move slower than copy?

本文关键字:复制 移动 std 为什么 速度      更新时间:2023-10-16

考虑以下程序。为什么移动比复制慢?我认为,当从函数返回局部值作为右值时,move语义大大加快了速度。你能告诉我为什么移动一个大向量比复制它慢吗?返回shared_ptr的基准是作为基本情况提供的。

#include <iostream>
#include <vector>
#include <string>
#include <chrono>
using namespace std;
vector<int> getStringByCopy()
{
   vector<int> v;
   for (int x = 0; x< 15000000;x++)  v.push_back(x);
   return v;
}
vector<int>&& getStringByMove()
{
  vector<int> v;
  for (int x = 0; x< 15000000;x++)   v.push_back(x);
  return move(v);
}
shared_ptr<vector<int>> getStringByPointer()
{
   shared_ptr<vector<int>> v = make_shared<vector<int>>();
   for (int x = 0; x< 15000000;x++)   v->push_back(x);
   return v;
}
int main(int argc, const char * argv[]) {
   // insert code here...
   chrono::system_clock::time_point begin = chrono::system_clock::now();
   vector<int> v = getStringByCopy();
   chrono::system_clock::time_point end = chrono::system_clock::now();
   cout << v[0] << "copy took " << chrono::duration_cast<chrono::microseconds>(end - begin).count() << endl;;
   begin = chrono::system_clock::now();
   vector<int>&& m = getStringByMove();
   end = chrono::system_clock::now();
   cout << m[0] << "move took " << chrono::duration_cast<chrono::microseconds>(end - begin).count() << endl;;
   begin = chrono::system_clock::now();
   shared_ptr<vector<int>> sp = getStringByPointer();
   end = chrono::system_clock::now();
   cout << (*sp)[0] << "pointer took " << chrono::duration_cast<chrono::microseconds>(end - begin).count() << endl;
   return 0;
}

输出为:

0copy took 437043
0move took 462803
0pointer took 394549  

您的方法本应按副本返回,但现在却按移动返回。如果您在一个方法中按每个值返回堆栈上分配的任何内容并返回它,那么您将获得一个自动移动。