在C#中,具有本地作用域的对象是否使用堆栈?

时间:2011-10-20 01:51:15

标签: c# stack

说我们有

void Foo() {
    var bar = new Bar();
    bar.Woo();
}

CLR会将堆栈用于局部变量吗?

如果没有,为什么?将堆栈用于范围有限的变量而不是使用更昂贵的垃圾收集器是不是更有效?

3 个答案:

答案 0 :(得分:1)

不仅CLR需要知道范围是本地的,而且还不能从其他任何地方引用该对象。这需要深入的代码分析,除了最​​简单的情况,例如您发布的情况。

答案 1 :(得分:1)

理论上,CLR可以执行某种类型的escape analysis。如果这导致了对象只能 从本地上下文访问的结论,那么它可以继续并在堆栈上分配对象。但是,在这一点上,没有完成,并且将始终在长期存储区域(也称为“堆”)中分配类。

另请注意,变量 bar 是在堆栈上分配的(或可能是已注册的)。它包含对新创建的Bar对象(在堆上)的引用,并在方法退出时消失。

答案 2 :(得分:0)

值类型在堆栈中 对于Reference类型,引用(像指针之类的东西)在堆栈上但对象在托管堆上

参考 C#概念:值与引用类型 http://www.albahari.com/valuevsreftypes.aspx