NRVO in VC++
どっちの option も非推奨な option "/Og" が暗黙的に指定されるという指摘があったのでちょっと修正。英語版を覗いてみると「非推奨」にあたるところが "deplicated" と書かれていたので後方互換のために残してあるだけで将来なくなりますよという意味での「非推奨」らしい。てかマジで Microsoft 社は localization ちゃんとしろ。
http://d.hatena.ne.jp/janus_wel/20100222/1266854346 で言ってた NRVO だけど VC++ でも特定の最適化 option を指定すると有効になるみたい。とりあえず以下の option が対象らしい。
- code size 最小化 "/O1" 、もしくは実行速度最適化 "/O2"
- 最大限の最適化 "/Ox"
- http://msdn.microsoft.com/ja-jp/library/59a3b321.aspx
ただし推奨されない option である全体的な最適化 "/Og" ( http://msdn.microsoft.com/ja-jp/library/1yk3ydd7.aspx ) が同時に指定されるのであまりホイホイ指定していいものではないらしい。
というわけで http://d.hatena.ne.jp/janus_wel/20100222/1266854346 で提示してた source を cl.exe /EHsc /O2 /DWIN32 main.cpp としてできた main.exe を実行すると以下のようになった。確かに NRVO が効いてる。
RVO Foo::Foo(void) NRVO Foo::Foo(void) binding temporary object by const reference Foo::Foo(void) binding named temporary object const reference Foo::Foo(void)