あれ?
最近ちこちこ自作ライブラリを整理(≒書き直し)中。
とりあえずベクトル演算系から。
以下少々マニアック。
まー、CGの分野のコードを書いてると、2D、3D、4Dのベクトルは良くでてくるんすよね。
んで、色とか座標とかがいろんな型になるんで、template全開で書く。
でまー、すんごいたくさん出てくるので、それなりに速度気にするわけですよ。
で、ふと、RVOどれくらい効いてるんだろうと思ってコピーコンストラクタの回数を測定。
template<std::size_t N, typename T> inline const TinyVector<N, T> operator+(const TinyVector<N, T>& lhs, const TinyVector<N, T>& rhs) { TinyVector<N, T> v(lhs); v += rhs; return v; } void test() { typedef TinyVector<2, float> Vector2D; Vector2D v1 = ...; Vector2D v2 = ...; Vector2D v3 = v1 + v2; // ... (ry }
とかやると、コピーコンストラクタが1回。i.e. RVOが効いているみたい。
ところが、
template<std::size_t N, typename T> inline const TinyVector<N, T> operator+(const TinyVector<N, T>& lhs, const TinyVector<N, T>& rhs) { return TinyVector<N, T>(lhs) += rhs; }
にすると、コピーコンストラクタが2回に増える。
予想と逆だなぁ。ちなみにコンパイルはMSVC 2005。なんでだろ。
そーゆーもんだからか?