this有什么好处吗?将两个矩阵相乘的 XNA 方法?
public static void Multiply (
ref Matrix matrix1,
ref Matrix matrix2,
out Matrix result
)
为什么结果是out参数而不是返回?使用简单的返回值是否有任何速度或内存优势?考虑到 Matrix 是一个结构,这与它有什么关系吗?我能理解为什么 matrix1
和 matrix2
是 ref 变量,所以它不必复制它们,但我不明白为什么第三个是输出参数而不是返回或引用变量。
最佳答案
是的,一个重要的。 Matrix 类型违反了 .NET 编程准则之一,结构不应大于 16 个字节。通常是 4 个 int 字段。矩阵有 16 个浮点字段,共 64 个字节。
16 字节建议与在生成的机器代码中传入/传出方法的结构相关。即使是 x86 内核,一个特别缺乏 CPU 寄存器的内核,也有足够的寄存器来允许结构存储在 CPU 寄存器而不是堆栈帧中。但是,如果它不适合,则该结构将通过堆栈框架传递。并在调用和接收时都被复制。这太贵了。这同样适用于返回值。
此费用的解决方法是通过 ref 或 out 传递结构值。就像 Multiply 方法一样。现在它只需要传递一个指向结构的指针,在 32 位内核上是 4 个字节。每次代码使用结构的字段时都必须取消引用指针的开销。没关系,类对象也需要它。
关于返回值为void时的C#out参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5523286/