все локальные переменные идут в стек - PullRequest
2 голосов
/ 01 февраля 2009

какова нагрузка на память в стеке и куча A по сравнению с B

A:

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

B

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

Ответы [ 2 ]

7 голосов
/ 01 февраля 2009

вопрос эффективности; два идентичных, и в режиме выпуска будет сведено к одному и тому же. В любом случае, string является ссылочным типом, поэтому сам string всегда находится в куче. Единственной вещью в стеке будет ссылка на string - несколько байтов (независимо от длины строки).

"все ли локальные переменные идут в стек": нет; Есть два исключения:

  • захваченные переменные (анонимные методы / лямбды)
  • блоков итераторов (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 голос
/ 01 февраля 2009

Они оба оптимизированы для одного и того же.

В ответ на вопрос в вашем заголовке «все ли локальные переменные помещаются в стек», простой ответ не совсем точен. Все объекты хранятся в «куче» (не помню, если это так называется в .NET) независимо. C # имеет сборщик мусора на основе поколений, который знает, что некоторые объекты живут очень короткое время, и поэтому предназначен для эффективного управления этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...