На данный вопрос уже ответили:
Представление кучи и стека
3 ответа
Я изучаю C# и пытаюсь понять что такое стек и куча. В большинстве примеров, стек подается как массив у которого есть функции push() и pop(). Но это не достаточное объяснение для меня. Вот к примеру, у нас есть функция Calculate()
void Calculate()
{
int x;
int y;
object z;
}
Какую роль в этом примере играет стек, а какую роль играет куча?
Ответ
Если рассматривать язык 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]
Комментариев нет:
Отправить комментарий