#c_sharp
This question already has answers here: Представление кучи и стека (3 ответа) Закрыт 2 года назад. Я изучаю C# и пытаюсь понять что такое стек и куча. В большинстве примеров, стек подается как массив у которого есть функции push() и pop(). Но это не достаточное объяснение для меня. Вот к примеру, у нас есть функция Calculate() void Calculate() { int x; int y; object z; } Какую роль в этом примере играет стек, а какую роль играет куча?
Ответы
Ответ 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]Ответ 2
В языке C# понятий «стек» и «куча» нет вовсе. Вместо них есть область жизни объектов. Объекты значимых типов живут от точки объявления до конца охватывающего блока (если это локальные переменные) или от начала до конца жизни содержащего объекта (если это поля). Объекты ссылочных типов живут от момента вызова new до момента, когда их съест сборщик мусора (а это случится гарантированно не раньше того, как у вас пропадёт последняя ссылка на объект). То, что локальные переменные значимых типов часто попадают в системный стек — не более чем деталь реализации текущей Майкрософтовской CLR. Знать об этом интересно, но не обязательно.
Комментариев нет:
Отправить комментарий