Как работает 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# несмотря на риски.