Как работает stackalloc? - PullRequest
0 голосов
/ 17 мая 2018

Здравствуйте, я пытаюсь выяснить, как работает stackalloc. Исходя из C/C++, насколько мне известно (ограничено), вы не можете динамически распределять память в стеке, как здесь:

C/C++ пример:

   void Allocate(int length){
     int vector[length];  //wont work
   }

Затем C# входит в игру, и вы можете сделать это с помощью stackalloc:

     void Allocate(int length){
      int []vector=stackalloc int [length];
     }

Разве не весь смысл распределения на stack, чтобы узнать на compile-time или precompile-time (macros и т. Д.), Какой размер будет иметь массив? Как C # управляет этим "magic"? Как будет создан стековый фрейм?

1 Ответ

0 голосов
/ 17 мая 2018

«Распределение по стеку» означает перемещение заголовка стека дальше от основания кадра стека текущей функции. Обычно это фиксированная величина - размер некоторых локальных переменных - но ничто не мешает вашей программе переместить заголовок стека на переменную величину, определяемую одним из аргументов.

Основная причина, по которой этого избегают, заключается в том, что он делает переполнение стека гораздо более вероятным и легко используется небрежными программистами. Таким образом, комитет по стандартизации C ++ решил не принимать массивы переменной длины , как в C99. alloca() - это нестандартная функция для платформы, которая даже не является частью стандарта POSIX.

Редактировать: Как указывает @PauloMorgado, в C # есть еще одно соображение: выделения в стеке не подлежат сборке мусора, в отличие от выделения в куче, что может мотивировать использование stackalloc() в C # несмотря на риски.

...