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

说我们有

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

CLR会使用堆栈作为局部变量吗?

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


不仅CLR需要知道范围是本地的,而且该对象也不会从其他地方引用。 除了最微不足道的情况之外,这需要进行深入的代码分析,就像您发布的那样。


理论上,CLR可以执行某种类型的逃逸分析。 如果这导致只能从本地上下文访问该对象的结论,则可以继续并在堆栈上分配对象。 然而,在这一点上,这还没有完成,并且一个课程将始终分配到长期存储区域(又名“堆”)。

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


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

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

链接地址: http://www.djcxy.com/p/78903.html

上一篇: In C#, do objects which have a local scope use the stack?

下一篇: Performance: should method return a class or struct?