2016-10-06 16 views
2

私は自分自身のMatrixクラスを構築し、演算子+オーバーロードについて質問します。C++演算子+行列のオーバーロード

​​

これは非常にうまく動作しますが、私はそれはそれは非効率的な私が最終的な目標(行列C)にコピーし、その後第1の一時行列を宣言することで少し心配ですか?たとえば、以下はナイーブな行列加算関数です。

void matrixAdd(Matrix& c, Matrix& a, Matrix& b) 
{ 
    c[][]=a[][]+b[][]; 
} 

もちろん、最初の方が使いやすいですが、2番目の方が高速でしょうか?もしそうなら、私はどのように最初のものを改善することができますか?

+0

独自のマトリックスクラスを作成する利点は何ですか?私はglmライブラリがこれ以上適切に処理していると感じています – Charlie

+0

@Charlieおそらくプログラミングクラスの基本的なテクニックを学ぶためです。 – Barmar

+0

このような 'Matrix'クラスの実装方法を見たい場合は、[GitHub](https://github.com/ForceBru/Matrix)の_Matrix_というプロジェクトをチェックしてください。 – ForceBru

答えて

5

あなたのスニペットは最新のコンパイラでうまくいきます。

tempの見かけのディープコピーを、という名前のリターン値最適化と呼ばれる手法を使用して最適化します。

つまり、コンパイラは最初のスニペットの改善を行い、2番目のスニペットは速くなることはありません。詳細については、参照https://en.wikipedia.org/wiki/Return_value_optimization

は最後にかかわらず、それはあなたがconst引数に演算子を適用することができます

Matrix Matrix::operator+(const Matrix &b) const

にプロトタイプを変更することをお勧めします。

+0

ありがとうございました!行列クラスがライブラリとして構築されている場合、これは何か違いはありますか? –

+0

リターン値の最適化という名前のついたものではありませんが、私たちはもっと明確なコードを書くことができます。 – Bathsheba

+0

私は両方の方法をテストしたところ、2番目の方法は最初の方法よりも30倍高速であることがわかりました。 –

関連する問題