0

誰かがこのシナリオで呼ばれるものを私に案内してもらえますか?

template<class T>
class mat4 {
public :

T matrix[4][4];

    mat4();
    mat4(vec4<T> i, vec4<T> j, vec4<T> k, vec4<T> t);
    mat4(const T input_matrix[4][4]);

    //~mat4();

    mat4<T> Transposed() const;
    void Transpose();

    mat4<T> Inversed() const;
    void Inverse();

};

上記のコードで私が呼び出す場合

mat4<float> matrix;
float mf[4][4];

//fill the float matrix here

matrix = mf;

次に、3番目のコンストラクターが呼び出されることを知っています(明示的ではありません)が、その横で何が呼び出されますか?代入操作から作成された一時オブジェクトを取得する行列のコピーコンストラクター?私はそれのためにカスタム代入演算子を作成するべきか、それとも単にそれ自体を処理させるべきかどうかを議論しています。カスタム演算子は、行列をmat4にコピーして、mat4への参照を返すだけですが、自動作成された代入演算子にオーバーヘッドがない場合は、それに固執したいと思います。

4

2 に答える 2

1

適切な戻り値の最適化は、これを 3 番目のコンストラクターへの呼び出しに減らす必要があります。最適化してコンパイルしている限り、この場合、オーバーヘッドを減らすために可読性を下げる必要はありません。

また、カスタム コピー コンストラクターおよび/または代入演算子のオーバーヘッドが、コンパイラー生成のものよりも少ないこともわかりません。最適化が複雑になることさえあります。

于 2012-05-11T14:20:30.170 に答える
0

この行列がを保持している場合std::vector<T>(16);、最新の暗黙的に生成された代入演算子は、から作成された一時の内容を「盗み」mf、2番目のコピーを回避します。古いコンパイラの場合、そのような代入演算子を自分で書くことができます(コピーアンドスワップのイディオムとは何ですか?を参照)。

ただし、この行列は配列をデータメンバーとして保持します。暗黙的に生成された代入演算子は、記述できる他の代入演算子と同様に、16個のT値のそれぞれを個別にコピー(またはTが移動可能な場合は移動)する必要があります(またはTが自明にコピー可能である場合は、単一のmemcpyを使用します)。コンパイラーは実際には一時的なものを最適化し、16個のTすべてを直接にコピーする場合mfがありますmatrix.matrixが、単純なRVOよりもかなり複雑な最適化です。私のテストでは、GCCがそれを行っているようです。

于 2012-05-11T14:48:43.673 に答える