2017-09-07 58 views
2

我有一個數學庫中的結構類型4x4矩陣。他們應該保持結構(否則太多堆分配,太多垃圾)。c#乘法運算符,參考操作數

有一個乘法運算符:

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

而且是由參取右側矩陣的成員函數:

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

現在,寫

Matrix4d DfromA = DfromC * CfromB * BfromA; 

是多少比寫作更具可讀性

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

不幸的是,第二個版本是兩倍的速度。

問題:

  1. 爲什麼是編譯器不夠聰明含蓄地提及採取的參數*操作?或者當sizeof()大於特定閾值時,通常通過引用將值類型參數作爲參考對待?

  2. 有沒有什麼辦法可以得到與第一個可讀性的第二個選項的性能?

回答

0

不,到目前爲止,還沒有內置到C#語言中。

有一個提議,在GitHub上「只讀」參數了:

#115:建議:「只讀」當地人和參數

然而,一直沒有這個(據我所知)正式添加到路線圖中,而不是明確地說這對運營商來說是可能的(儘管我懷疑它會這樣)。

但是現在,沒有辦法獲得第二個解決方案的ref-第一個解決方案的語法。

如果你沒事不安全的代碼,你可以排序得到行爲的一些通過使參數來操作的地址之一,但運營商之一將是結構本身,這將通過存儲器複製提供,所以它不是很好。

下面是代碼完整性但我強烈對此建議!

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

你將不得不這樣稱呼它:

Matrix4d c = a * &b;