あれ?

最近ちこちこ自作ライブラリを整理(≒書き直し)中。
とりあえずベクトル演算系から。


以下少々マニアック。


まー、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。なんでだろ。
そーゆーもんだからか?