当用作函数的返回值时,C#结构是否曾被装箱?

当用作函数的返回值时,C#结构是否曾被装箱?,第1张

概述一个简单的问题,但我还没有找到Stack Overflow的明确答案. struct foo { int x; int y; int z; } foo Func() { return new foo(); } void Func2() { foo f = Func(); // did boxing and unbox 一个简单的问题,但我还没有找到Stack Overflow的明确答案.
struct foo { int x; int y; int z; }    foo Func()    {        return new foo();    }    voID Func2()    {        foo f = Func();     // dID Boxing and unBoxing occur?    }

函数返回时,C#struct(值类型)是否始终复制到堆栈中,无论它有多大?我不确定的原因是,对于除MSIL之外的一些指令集(例如x86),返回值通常需要适合处理器寄存器,并且不直接涉及堆栈.

如果是这样,那么调用站点是否为CLR堆栈预先分配了(预期)值返回类型的空间?

[编辑:回复摘要:]对于原始问题的意图,答案是否定的; CLR永远不会(默默地)将结构化为仅仅为了将其作为返回值发送.

解决方法 这是JIT编译器的重要实现细节.通常,如果结构足够小并且具有简单的成员,那么它将在cpu寄存器中返回.如果它变得太大,那么调用代码会在堆栈上保留足够的空间并将指针传递给该空间作为额外的隐藏参数.

它永远不会被装箱,除非方法的返回类型当然是对象.

Fwiw:这也是调试器无法在autos窗口中显示函数返回值的原因.有时痛苦.但是调试器没有从JIT编译器获得足够的元数据来确切地知道在哪里找到值.编辑:在VS2013中修复.

总结

以上是内存溢出为你收集整理的当用作函数的返回值时,C#结构是否曾被装箱?全部内容,希望文章能够帮你解决当用作函数的返回值时,C#结构是否曾被装箱?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1249897.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存