为什么 std:: move 比 copy 慢?

Why is std:: move slower than copy?

考虑以下程序。为什么移动比复制慢?我认为移动语义在从函数返回局部变量作为右值时大大加快了速度。你能告诉我为什么移动一个大向量比复制它慢吗?返回 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  

您的方法应该 return 每个副本已经 return 每个移动。如果您 return 在方法中按值在堆栈上分配的任何内容,并且 return 它,那么您将获得自动移动。