2017-09-07 7 views
2

数式ライブラリに構造型4x4行列があります。それらは構造体でなければなりません(ヒープ割り当てが多すぎる、ゴミが多すぎる)。参照でオペランドを取る乗算演算子

乗算演算子があります:、

Matrix4d DfromA = DfromC * CfromB * BfromA; 

を書くことくらいです

public Matrix4d Mult(ref Matrix4d rhs) {...} 

public static Matrix4d operator *(Matrix4d lhs, Matrix4d rhs) {...} 

はとrefで右側の行列をとるメンバ関数があります書き込みよりも読みやすい。

Matrix4d DfromB = DfromC.Mult(ref CfromB); 
Matrix4d DfromA = DfromB.Mult(ref BfromA); 

残念ながら、2番目のバージョンは2倍の速さです。

質問:

  1. はなぜコンパイラが暗黙的に参照することにより*演算子の引数を取るために十分にスマートではないでしょうか?または、sizeof()が特定のしきい値より大きい場合、値型の引数をメソッドに一般的に参照で扱いますか?

  2. 2番目のオプションのパフォーマンスを最初のものから読み出す方法はありますか?

答えて

0

いいえ、まだC#言語には何も組み込まれていません。

githubの上のパラメータを「読み取り専用」のための提案があります:

#115:提案:「読み取り専用」地元の人とパラメータ

ためしかし、これは(私の知る限りでは)していないはされてこれは正式にロードマップに追加されたものであり、オペレータにとっては可能だとはっきり言っているわけではありません。

しかし、いいえ、最初の構文を使用して2番目のソリューションの精度を得る方法はありません。

あなたが危険なコードを使用して罰金している場合、あなたはのソートオペレータへのパラメータの一つのアドレスを作ることによって行動の一部を得ることができますが、事業者の一つは、構造体自体なければならないだろう、これはメモリコピーによって提供されるため、すべてではありません。

完全性のコードはですが、私はと強くこれに対してアドバイスします!

Matrix4d c = a * &b; 
:あなたはこのようにそれを呼び出す必要があります

public static Matrix4d operator *(Matrix4d a, Matrix4d* b) 
{ 
    return new Matrix4d(a.V00 * (*b).V00, ...); 
} 

関連する問題