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

返回值为空时的C#out参数,c#,struct,xna,C#,Struct,Xna,将两个矩阵相乘对XNA方法有什么好处吗 public static void Multiply ( ref Matrix matrix1, ref Matrix matrix2, out Matrix result ) 为什么结果是out参数而不是返回的?使用简单的返回值是否有速度或内存优势?考虑到矩阵是一个结构,这和它有什么关系吗?我能理解为什么matrix1和matrix2是ref变量,所以它不必复制它们,但我不明白为什么第三个是out参数而不是return或

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

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

为什么结果是out参数而不是返回的?使用简单的返回值是否有速度或内存优势?考虑到矩阵是一个结构,这和它有什么关系吗?我能理解为什么
matrix1
matrix2
是ref变量,所以它不必复制它们,但我不明白为什么第三个是out参数而不是return或ref变量。

可以说是出于同样的原因:这样就不必复制它(因为它是值类型)。但是,我不知道编译器是否可以省略这个副本,以及在什么情况下——如果可以的话,那么这已经是一种丑陋的方式,不能给你带来任何好处


还要记住可变值类型。

是的,这有一个性能优势。考虑到它是一种值类型,性能会更好,将其作为out参数可以将其从被调用者封送回调用者


查看和的备注。

是的,很重要。矩阵类型违反了.NET编程准则之一,结构不应大于16字节。通常为4个整型字段。矩阵有16个浮点字段,总共64字节

16字节的建议与生成的机器代码中传递给/来自方法的方式结构相关。即使是特别缺乏CPU寄存器的x86内核,也有足够的寄存器允许结构存储在CPU寄存器中,而不是堆栈帧中。但是,如果它不适合,则结构将通过堆栈帧。并且在呼叫和接收时都会被复制。那太贵了。这同样适用于返回值


此费用的解决方法是通过ref或out传递结构值。就像乘法方法一样。现在它只需要传递一个指向结构的指针,32位内核上有4个字节。每次代码使用结构的字段时都必须取消对指针的引用。没关系,这也是类对象所需要的。

当使用XNA瞄准xbox 360时,这一性能优势很有帮助,因为cpu的性能不如大多数PC cpu。当然,这是一个游戏开发框架,所以正常规则不适用;)+我的回答太棒了!我知道表演的含义,但不是他们的原因,谢谢!