я наткнулся на статью http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/Передача по значению и скопировать оптимизации Elision
Авторский Совет:
Не копировать ваши аргументы функции. Вместо этого передайте их по значению и , чтобы компилятор выполнил копирование.
Однако, я не совсем понимаю, что выгоды получили в два примера, приведенного в статье:
//Don't
T& T::operator=(T const& x) // x is a reference to the source
{
T tmp(x); // copy construction of tmp does the hard work
swap(*this, tmp); // trade our resources for tmp's
return *this; // our (old) resources get destroyed with tmp
}
против
// DO
T& operator=(T x) // x is a copy of the source; hard work already done
{
swap(*this, x); // trade our resources for x's
return *this; // our (old) resources get destroyed with x
}
В обоих случаях создается одна дополнительная переменная , так где же выгоды? Единственное преимущество, которое я вижу, заключается в том, что временный объект передается во второй пример.
Если источник является временным: 'obj = T();' или 'obj = foo();' где 'foo()' возвращает 'T'. – juanchopanza
Это на самом деле не очень хороший совет. Он раскрывает то, что должно быть детальностью реализации (копируете ли вы аргумент или нет) в интерфейсе, что является крайне плохой разработкой программного обеспечения. Могут быть моменты, когда профайлер говорит, что вам нужно, но в остальном вы придерживаетесь правил кодирования. (Вездесущее руководство, по-видимому, относится к классам классов пропуска по ссылке, все остальное по стоимости, хотя это тоже можно рассматривать как преждевременную оптимизацию.) –
@jameskanze «эта функция копирует состояние аргумента» является разумной функцией интерфейса. Помимо всего прочего, это влияет на стоимость, оно говорит вам, какие функции типа аргументов должны быть реализованы, и даже информирует пользователя о функциональности. Часть гения C++ 11 заключалась в том, что копирование и перемещение важны, а районные операции с данными - и важно, чтобы это происходило. – Yakk