Как работает stackalloc?

Здравствуйте, я пытаюсь выяснить, как это 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 ответ

Решение

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

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

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

Другие вопросы по тегам