返回值为void时的C#out参数

标签 c# struct xna

this有什么好处吗?将两个矩阵相乘的 XNA 方法?

public static void Multiply (
     ref Matrix matrix1,
     ref Matrix matrix2,
     out Matrix result
)

为什么结果是out参数而不是返回?使用简单的返回值是否有任何速度或内存优势?考虑到 Matrix 是一个结构,这与它有什么关系吗?我能理解为什么 matrix1matrix2 是 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/

相关文章:

c++ - LLVM 的位码对函数参数的错误检测

c# - 如何将包含数组的结构转换为字节数组?

python - ctypes.Structure 在运行时修改_fields_

c# - 如果出现问题,是否可以恢复 GraphicsDevice?

c# - 为什么转换此指数会抛出 FormatException?

c# - 为什么 DbSet Add 返回的是实体实例而不是 void?

c# - asp.net存储过程输入/输出参数

c# - Chrome 83 中取消的 HTTP 请求

c# - 动画标题(如泰拉瑞亚的游戏标题)

c# - 切开声音效果/静音的开始