我在数学库中有结构类型4x4矩阵。它们应该保留结构(否则堆分配太多,垃圾太多)。
有一个乘法运算符:
public static Matrix4d operator *(Matrix4d lhs, Matrix4d rhs) {...}
并且有一个成员函数,它通过ref:
获取右手矩阵public Matrix4d Mult(ref Matrix4d rhs) {...}
现在,写
Matrix4d DfromA = DfromC * CfromB * BfromA;
比写作
更具可读性Matrix4d DfromB = DfromC.Mult(ref CfromB);
Matrix4d DfromA = DfromB.Mult(ref BfromA);
不幸的是,第二个版本的速度是其两倍。
问题:
为什么编译器不够聪明,不能通过引用隐式地将参数带到*运算符?或者当sizeof()大于某个阈值时,通常通过引用来处理方法的值类型参数?
有没有办法让第二个选项具有第一个选项的可读性?
答案 0 :(得分:0)
不,C#语言还没有内置。
有一个" readonly" github上的参数:
#115:提案:' readonly'本地人和参数
然而,这并没有(据我所知)正式添加到路线图中,并没有明确表示这对运营商来说是可行的(虽然我怀疑它会这样)。
但是现在,不,没有办法用第一个语法获得第二个解决方案的ref
-
如果您对不安全的代码不满意,您可以通过向运营商提供一个参数地址来排序获取某些行为运算符本身必须是结构本身,它将通过内存复制提供,因此它并不都是好的。
这里的代码只是为了完整性,但我强烈建议不要这样做!
public static Matrix4d operator *(Matrix4d a, Matrix4d* b)
{
return new Matrix4d(a.V00 * (*b).V00, ...);
}
你必须这样称呼它:
Matrix4d c = a * &b;