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

时间:2011-04-02 12:57:33

标签: c# struct xna

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

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

为什么结果是out参数而不是返回?使用简单的返回值是否有任何速度或内存优势?考虑到Matrix是一个结构,这与它有什么关系吗?我可以理解为什么matrix1matrix2是ref变量,因此它不必复制它们,但我不明白为什么第三个是out参数而不是return或ref变量。

3 个答案:

答案 0 :(得分:7)

是的,重要的一个。 Matrix类型违反了.NET编程的一个指导原则,结构不应大于16个字节。通常是4个int字段。 Matrix有16个浮点字段,总共64个字节。

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

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

答案 1 :(得分:4)

可以说是出于同样的原因:所以不必复制它(因为它是一个值类型)。但是,我不知道编译器是否可以忽略这个副本以及在什么情况下 - 如果可以的话,那么这已经是一种丑陋的做事方式,不会给你任何东西。

还要记住可变值类型give off a bad smell to begin with

答案 2 :(得分:3)

是的,有性能优势。考虑到它是一个值类型,性能更好,并且使其成为out参数允许它从被调用者封送回调用者。

查看OutAttributeBlittable and Non-Blittable types的评论。