gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:06 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com