通过引用获取操作数的 c# 乘法运算符

标签 c# matrix reference operators

我在数学库中有结构类型 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);

不幸的是,第二个版本的速度是它的两倍。

问题:

  1. 为什么编译器不够智能,无法通过引用将参数隐式地传递给 * 运算符?或者当方法的 sizeof() 大于某个阈值时,通常通过引用来处理方法的值类型参数?

  2. 有什么方法可以让我在兼顾第一个选项的可读性的同时获得第二个选项的性能?

最佳答案

不,到目前为止,C# 语言中还没有内置任何内容。

github 上有一个关于“readonly”参数的提议:

#115: Proposal: 'readonly' for Locals and Parameters

但是,这还没有(据我所知)正式添加到路线图中,也没有明确表示这对运营商来说是可能的(尽管我怀疑它会)。

但是现在,不,没有办法用第一个解决方案的语法获得第二个解决方案的 ref-ness。

如果您对不安全的代码没问题,您可以某种通过将运算符的参数之一设为地址来获得一些行为,但其中一个运算符必须是结构本身,这将通过内存复制提供,所以这并不是很好。

这里的代码只是为了完整性但我强烈建议不要这样做!

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

你必须这样调用它:

Matrix4d c = a * &b;

关于通过引用获取操作数的 c# 乘法运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46087177/

相关文章:

c++ - 将 std::vector::data 传递给期望类型**(双指针)的函数

javascript - 检索已使用 JavaScript 重新排序的选择元素选项列表

c# - XNA 中的多点触控事件

c - 将 C 语言中以逗号分隔的文件的矩阵输入转换为 2D

rust - 为什么不能在同一结构中存储值和对该值的引用?

java - 在 Java 中,定义数组是为引用分配空间还是为对象本身分配空间?

c# - 在静态方法线程安全的 HttpContext.Current 上使用 foreach 吗?

c# - 在 Silverlight 中点击编辑

java - 如何使用 java.util.Scanner 处理多个输入?

python - 相对于没有重复列的列转置数据框