加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 04:36:04 所属栏目:百科 来源:网络整理
导读:我在C#中有一个方法需要返回一个非常大的数组(或任何其他大数据结构). 使用ref或out参数而不是标准返回值是否有性能提升? I.E.使用中是否有任何表现或其他收益 void function(sometype input,ref largearray) 过度 largearray function(sometype input) 解
我在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字节指针传递给该空间作为方法的参数来调用.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读