Что такое стек и куча?

459
27 августа 2017, 01:58

Я изучаю C# и пытаюсь понять что такое стек и куча. В большинстве примеров, стек подается как массив у которого есть функции push() и pop(). Но это не достаточное объяснение для меня. Вот к примеру, у нас есть функция Calculate()

void Calculate()
{
int x;
int y;
object z;
}

Какую роль в этом примере играет стек, а какую роль играет куча?

Answer 1

Если рассматривать язык c# сам по себе, в отрыве от реализации, то действительно знать о том, что такое "стек" вам нет необходимости.

Но если вы хотите хорошо понимать тот инструмент, которым пользуетесь, то можно посмотреть немного под капот.

Платформа Microsoft .NET использует стековый байт-код Intermediate Language (IL, CIL, MSIL).

То есть код, который вы напишите, будет записан в опкодах этого языка и уже непосредственно его и будет выполнять CRL.

Посмотрим на какой-либо простой код c# и на то, как он записан опкодами:

void Main()
{
    int a = 15;
    int b = 10;
    int c = a - b;
    Console.WriteLine(c);
}

IL-код я получил в программе Linqpad, в IL DASM будет такой же:

IL_0000:  nop         
IL_0001:  ldc.i4.s    0F 
IL_0003:  stloc.0     // a
IL_0004:  ldc.i4.s    0A 
IL_0006:  stloc.1     // b
IL_0007:  ldloc.0     // a
IL_0008:  ldloc.1     // b
IL_0009:  sub         
IL_000A:  stloc.2     // c
IL_000B:  ldloc.2     // c
IL_000C:  call        System.Console.WriteLine
IL_0011:  nop         
IL_0012:  ret 

Что мы видим при наведении мыши на ldc или stloc? Мы видим всплывающие подсказки "pushes int value onto stack" или "pops value from top of stack".

То есть все ваши инструкции на c# оказываются очень тесно связанными со стеком. Даже простые операции типа сложения чисел проходят через стек. И циклы фактически тоже разворачиваются в стековые инструкции.

Это как раз устройство нижележащего этажа для c#. Современные языки программирования достаточно часто используют концепцию стековых машин, c# -- один из них.

PS Если хочется погрузиться в эту тему более основательно, то хорошей отправной точкой может стать статья Введение в MSIL [Кенни Керр, пер. Aquila]

Answer 2

В языке C# понятий «стек» и «куча» нет вовсе. Вместо них есть область жизни объектов.

Объекты значимых типов живут от точки объявления до конца охватывающего блока (если это локальные переменные) или от начала до конца жизни содержащего объекта (если это поля). Объекты ссылочных типов живут от момента вызова new до момента, когда их съест сборщик мусора (а это случится гарантированно не раньше того, как у вас пропадёт последняя ссылка на объект).

То, что локальные переменные значимых типов часто попадают в системный стек — не более чем деталь реализации текущей Майкрософтовской CLR. Знать об этом интересно, но не обязательно.

READ ALSO
Задержка секундомера

Задержка секундомера

Создал бесконечный секундомер который отсчитывает от 5 до 0, а когда значение секундомера доходит до нуля, начинает считать заново:

251
действие при вылете приложения

действие при вылете приложения

Как выполнить код (к примеру запустить CrashReporterexe) в случае вылета приложения?

229
Повторяемость кода (Web API)

Повторяемость кода (Web API)

ЗдравствуйтеВ процессе написания собственного API, сложилась такая ситуация:

211
Библиотека необходимых классов С#

Библиотека необходимых классов С#

Добрый день! Я тут подумал, а что если написать одну библиотеку где будет все необходимое, но тут возник вопросТак как я не опытный специалист...

177