【发布时间】:2017-09-07 03:03:30
【问题描述】:
我在数学库中有 struct 类型的 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() 大于某个阈值时,一般通过引用来处理方法的值类型参数?
有什么方法可以让第二个选项的性能与第一个选项的可读性相同?
【问题讨论】:
标签: c# matrix reference operators