【发布时间】:2010-09-18 18:27:30
【问题描述】:
一个简单的问题,但我还没有在 Stack Overflow 上找到明确的答案。
struct MyStruct { int x, y, z; }
MyStruct GetMyStruct() => new MyStruct();
static void Main()
{
var x = GetMyStruct(); // can boxing/unboxing ever occur?
}
C#结构(值类型)总是在从函数返回时复制到堆栈中,无论它有多大?我不确定的原因是对于MSIL以外的一些指令集(例如x86),返回值通常需要适合处理器寄存器,并且不直接涉及堆栈。
如果是这样,是否是调用站点在 CLR 堆栈上为(预期的)值返回类型预分配空间?
[编辑:回复摘要:] 对于原始问题的意图,答案是否定的; CLR 永远不会仅仅为了将结构体作为返回值发送而(默默地)装箱。
【问题讨论】:
-
如果一个值类型的返回是 ever(你使用 'ever' 似乎暗示有时如果它发生,它不是无条件的)装箱,这意味着当我们分配返回值类型变量,这似乎效率低下。我对 MSIL 和 CLR 几乎一无所知,所以在这里我无法为您提供帮助。无论如何,我可以知道是什么引发了您的问题吗?
-
@blizpasta:当我意识到我错误地认为'ref'(和'out')关键字导致值类型的装箱(事实并非如此)时,我的原始问题实际上变得毫无意义。为了避免这种情况,我打算“归还”这些结构。但是,一旦我记得 'ref' 不会将值类型装箱,使用 out 参数就成为了一种选择。我的值类型的大小目前是 4+IntPtr.Size 字节,数十万个这样的结构被非常密集地操作。
标签: c# struct return-value boxing value-type