C# · 12月 21, 2021

C#函数正常返回值VS out或ref参数

我在C#中有一个方法需要返回一个非常大的数组(或任何其他大数据结构).

使用ref或out参数而不是标准返回值是否有性能提升?

I.E.使用中是否有任何表现或其他收益

void function(sometype input,ref largearray)

过度

largearray function(sometype input)解决方法 32位x86处理器上用于传递各种类型参数的堆栈空间量:

>字节:4个字节
> bool:4个字节
>枚举:4个字节
> char:4个字节
>短:4个字节
> int:4个字节
> long:8个字节
> float:4个字节
> double:8个字节
>十进制:16个字节
> struct:结构的运行时大小

>字符串:4个字节
>数组:4个字节
>对象:4个字节
>接口:4个字节
>指针:4个字节
>类实例:4个字节

该行下面的参考类型,它们的大小将在64位处理器上加倍.

对于静态方法调用,最多4个字节的前2个参数将通过cpu寄存器传递,而不是堆栈.对于实例方法调用,只有一个参数将通过寄存器传递.其余的都在堆栈上传递. 64位处理器支持通过寄存器传递4个参数.

从列表中可以清楚地看出,你应该考虑通过ref传递参数的唯一时间是结构.对此的正常指导是在结构大于16个字节时这样做.猜测结构的运行时大小并不总是容易的,通常最多4个字段是准确的.如果这些字段是double,long或decimal,则减少.因此,本指南通常建议将您的结构转换为类,正是出于这个原因.

还要注意,没有节省将参数作为字节或短的故意传递,int是32位处理器满意的类型.对于当前可用的64位处理器也是如此.

方法返回值,问题的真实主题几乎总是在cpu寄存器中返回.大多数类型适合放在eax或edx:eax寄存器中,FPU寄存器用于浮点值.唯一的例外是大结构和十进制,它们太大而不适合寄存器.它们通过在堆栈上为返回值保留空间并将4字节指针传递给该空间作为方法的参数来调用.