one-phase construction

書くネタが無いので、他の記事に便乗するでゲソ!


関連:One-Phase Construction 入門 〜 Constructor run once


つまりこういうことでゲソか?

#include <boost/noncopyable.hpp>

struct vec
    : public boost::noncopyable{
    vec() : x(0.0f), y(0.0f), z(0.0f){}
    vec(float _x, float _y, float _z)
         : x(_x), y(_y), z(_z){}

    float x, y, z;
};

vec
make_vec(float x, float y, float z){
    return vec(x, y, z);
/*
//  one-phase construction がない場合は、
//  下記の様な記述をする必要があるが、
//  これだと無駄なコピーが発生してしまうでゲソ!
    vec result;
    result.x = x;
    result.y = y;
    result.z = z;
    return result;
*/
}

int
main(){

    vec    v = vec(0.0f, 0.0f, 0.0f);     // one-phase construction があれば
    vec v2(0.0f, 0.0f, 0.0f);             // 無駄なコピーがなくて
    vec v3 = make_vec(0.0f, 0.0f, 0.0f);  // 早いでゲソ

    return 0;
}


オブジェクトの生成時に値を代入するか、オブジェクトを生成した後に値を代入するかの違いですね。
template 関数とかで、one-phase construction の有無で処理を切り分けることが出来ればさらに便利そう。


[追記]
コメントを頂いてから改めて元記事を読んでみたら解釈が全然違っていたので追記。
ゲソゲソ行ってる場合じゃないでゲソ!


まぁ要点だけまとめると、one-pahse construction とは、一時オブジェクトを生成せずに、コンストラクタを直接呼んで初期化を行うこと。(無駄なオブジェクトを作らない考え)
つまり上のソースで例えるなら、

vec v(0.0f, 0.0f, 0.0f);

が、それにあたる。
こうすることで、無駄な一時オブジェクトは生成されない。


この様な書き方だと無駄な一時オブジェクトが生成されてしまう。

vec v = vec(0.0f, 0.0f, 0.0f);
vec v2 = make_vec(0.0f, 0.0f, 0.0f);


boost::noncopyable の様なコピー出来ないクラスを利用する事が出来るのは、one-phase construction 利点の1つに過ぎない。


まぁとりあえず、コンストラクタで初期化出来るようにしておけば、幸せになれるとかそんな感じ。
相変わらずの適当っぷりに死にたい。
ちゃんと読まないからこんな事になるんだ!