Ниже приведен фрагмент, который я нашел в документации по стилю кодирования для библиотеки:
По возможности, лучше использовать временную, а не сохранение именованного объекта, например:
DoSomething (XName ( "blah" ));
а не
XName n ( "blah" ); DoSomething (n);
поскольку это облегчает компилятору оптимизацию вызова, может уменьшить размер стека функции и т.д. Не забывайте учитывать время жизни временного, однако.
Предполагая, что объект не нуждается в изменении, а проблемы с жизненным циклом не являются проблемой, верно ли это правило? Я думал, что в наши дни это не изменит ситуацию. Однако в некоторых случаях вы не могли избежать именованного объекта:
XName n("blah");
// Do other stuff to mutate n
DoSomething( n );
Кроме того, с семантикой перемещения мы можем написать такой код, поскольку временные исключения устраняются:
std::string s1 = ...;
std::string s2 = ...;
std::string s3 = ...;
DoSomething( s1 + s2 + s3 );
а не (я слышал, что компилятор может лучше оптимизировать со следующим в С++ 03):
std::string s1 = ...;
std::string s2 = ...;
std::string s3 = ...;
s1 += s2;
s1 += s3; // Instead of s1 + s2 + s3
DoSomething(s1);
(Конечно, приведенное выше может сводиться к measure and see for yourself
, но мне было интересно, имеет ли вообще общее упоминание выше).