Насколько я понимаю, одной из целей добавления семантики перемещения является оптимизация кода путем вызова специального конструктора для копирования "временных" объектов. Например, в ответе this мы видим, что его можно использовать для оптимизации такого материала string a = x + y
. Поскольку x + y является выражением rvalue, вместо глубокого копирования мы можем скопировать только указатель на строку и размер строки. Но, как мы знаем, современные компиляторы поддерживают оптимизацию возвращаемого значения, поэтому без использования семантики перемещения наш код вообще не будет вызывать конструктор копирования.
Чтобы доказать это, я пишу этот код:
#include <iostream>
struct stuff
{
int x;
stuff(int x_):x(x_){}
stuff(const stuff & g):x(g.x)
{
std::cout<<"copy"<<std::endl;
}
};
stuff operator+(const stuff& lhs,const stuff& rhs)
{
stuff g(lhs.x+rhs.x);
return g;
}
int main()
{
stuff a(5),b(7);
stuff c = a+b;
}
И после выполнения его в VС++ 2010 и g++ в режиме оптимизации я получаю пустой вывод.
Какая оптимизация, если без этого мой код все еще работает быстрее? Не могли бы вы объяснить, что я понимаю неправильно?