2012-11-19 29 views
1

只是想知道如果我没有关心垃圾收集,如果我分配新的结构。C#在结构上做了新的事情总是在堆栈上分配?

如果他们后来被铸造成一个对象会怎么样?

public object Func() 
{ 
    SMyStruct bla = new SMyStruct(); 

    return bla; 
} 
+4

您可能对[本文]感兴趣(http://blogs.msdn.com/b/ericlippert/archive/2009/04/27/the-stack-is-an-implementation-detail。 aspx)Eric Lippert。 –

+0

@FrédéricHamidi谢谢,但需要一些时间阅读和理解它。 – clamp

回答

1

它将被“装箱”并将分配在堆上。

里氏CLR通过C#:

有可能使用的机制称为拳击值类型转换为引用类型。在内部,以下是当valueetype的一个实例被装箱时发生的情况:

  1. 从托管堆分配内存。分配的内存量是值类型字段所需的大小,以及托管堆上所有对象所需的两个额外开销成员(类型对象指针和同步块索引)。

  2. 值类型的字段被复制到新分配的堆内存中。

  3. 返回对象的地址。这个地址现在是一个对象的引用;值类型现在是一个引用类型。

+0

对不起,当然堆 –

+0

所以它将首先在堆栈上创建,然后移动到堆? – clamp

+0

@clamp [关于价值类型的真相](http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx) –