Здравствуйте, я пытаюсь выяснить, как это 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"
? Как будет создан стековый фрейм?
«Распределение по стеку» означает перемещение заголовка стека дальше от основания кадра стека текущей функции. Обычно это фиксированная величина — размер некоторых локальных переменных — но ничто не мешает вашей программе переместить заголовок стека на переменную величину, определяемую одним из аргументов.
Основная причина, по которой этого избегают, заключается в том, что это делает переполнение стека гораздо более вероятным и легко используется небрежными программистами. Таким образом, стандартный комитет C ++ решил не принимать массивы переменной длины как в C99. alloca()
это нестандартная функция для конкретной платформы, которая даже не является частью стандарта POSIX.
Редактировать: Как указывает @PauloMorgado, в C # есть еще одно соображение: выделения в стеке не подлежат сборке мусора, в отличие от выделения в куче, что может мотивировать использование stackalloc()
в C # несмотря на риски.
Других решений пока нет …