C++でのオブジェクトの値返しはモーマンタイ?

自分は9年ばかし JavaC# を扱ってまして、ほとんど「GC元年生まれ」みたいなプログラマです。なので、GCありきの実装法である「関数内でオブジェクトをnewしてそれを返す」なんてのを常識的にやっていました。ところが、5年ほど前から C++ を使うようになり、動的メモリの破棄を意識せざるを得なくなると、上記の実装法はメモリリークを生みやすい構造になるため、できるだけ使わないように頑張ってきました。
このとき、オブジェクトを1つだけ得たい場合には「関数にあらかじめ参照引数として渡しておくか」あるいは「関数から返値として得るか」の2つの策があります。前者では、(イメージで言うとscanfみたいに)関数呼び出しの前にあらかじめメモリ領域を確保しておく必要があり、このときに(必要であれば)その確保サイズなども決めてやる必要があります。ただ、関数内でしか確保サイズが決めれないケースなんて多々あるわけで、若干冗長な感じになります。一方後者では、値渡しなのでオブジェクトの不必要なコピーが生じてパフォ−マンスが悪くなります。なので、悩ましいながらも自分は前者を使っていました。
ところが、これって後者でも返値を直接変数に代入するように書いておけば、自動的にコピーが発生しないように上手に最適化するようです。それを先週知りました(orz)。実際、後者に変更したら、ソースが見やすくなった挙句にスピードまで速くなりやがりました。なんてこったい。
詳しく知りたい人は「NRVO」とか「右辺値参照」で検索すると良いです。あと↓の記事が分かりやすかったです。

ご参考に。