Как работает 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"? Как будет создан стековый фрейм?

4

Решение

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

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

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

5

Другие решения

Других решений пока нет …