当前位置:  开发笔记 > 编程语言 > 正文

将所有局部变量放在堆栈上

如何解决《将所有局部变量放在堆栈上》经验,为你挑选了1个好方法。

堆栈上的内存开销和A与B的堆是多少

A:

private string TestA()
{
     string a = _builder.Build();
     return a;       
}

B:

private string TestB()
{
     return _builder.Build();
}

Marc Gravell.. 7

重新提出效率问题; 两者是相同的,在发布模式下将减少到相同的东西.无论哪种方式,string都是引用类型,因此它string本身总是在堆上.堆栈上唯一的东西就是引用string- 几个字节(无论字符串长度).

"将所有局部变量放在堆栈上":不; 有两个例外:

捕获变量(匿名方法/ lambdas)

迭代器块(yield return等)

在这两种情况下,幕后都有一个编译器生成的类:

int i = 1;
Action action = delegate {i++;};
action();
Console.WriteLine(i);

类似于:

class Foo {
    public int i; // yes, a public field
    public void SomeMethod() {i++;}
}
...
Foo foo = new Foo();
foo.i = 1;
Action action = foo.SomeMethod;
action();
Console.WriteLine(foo.i);

因此i是在一个对象上,因此在堆上.

迭代器块以类似的方式工作,但使用状态机.



1> Marc Gravell..:

重新提出效率问题; 两者是相同的,在发布模式下将减少到相同的东西.无论哪种方式,string都是引用类型,因此它string本身总是在堆上.堆栈上唯一的东西就是引用string- 几个字节(无论字符串长度).

"将所有局部变量放在堆栈上":不; 有两个例外:

捕获变量(匿名方法/ lambdas)

迭代器块(yield return等)

在这两种情况下,幕后都有一个编译器生成的类:

int i = 1;
Action action = delegate {i++;};
action();
Console.WriteLine(i);

类似于:

class Foo {
    public int i; // yes, a public field
    public void SomeMethod() {i++;}
}
...
Foo foo = new Foo();
foo.i = 1;
Action action = foo.SomeMethod;
action();
Console.WriteLine(foo.i);

因此i是在一个对象上,因此在堆上.

迭代器块以类似的方式工作,但使用状态机.

推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有