2016年10月4日火曜日

rvo と nrvo と API 設計

十数年も経過するので、今時のコンパイラなら意識するまでもなく実装している。

特に教科書然としたものなどで例に挙げられるような単純なケースなら確実に最適化がされる。


実際問題どんな状況なのかを調べてみることにした。


test_rvo_nrvo

これは vc だが相変わらず分岐を挟むと残念なことになるようだ。

しかし、gcc と clang で確認を行うと分岐があるにも関わらずきっちり最適化がされる。

---

const correctness について、ここでは関数の戻り型が焦点となる。

const なポインタや参照を返す場合、やはり一抹の不安が残る。

回避するにはコピーを返せばいいのだが、rvo または nrvo が効くか否かが

重要な場面も多々ある。

要はパフォーマンス問題に帰着する。


API の設計に統一性を持たせたいのだが、クロスプラットフォームだと

足を引っ張ってる方に合わせるしかないかな。

---

(追記)

と少し錯乱していたが、vc だけ少し特殊なことをすれば恩恵を授かることができた。
面倒くさい・・・。