Распределение стека более эффективно.
от вопрос уже есть ответ здесь:
массив переменных размера g ++ без предупреждения? 1 ответНасколько я понимаю, в C и C ++ мы создаем структуры данных, размер которых известен во время компиляции в стеке, и мы используем кучу (malloc-free / new-delete) для вещей, размер которых не известен во время компиляции, и определяется во время выполнения. Почему тогда мой компилятор g ++ позволяет мне делать что-то вроде следующего фрагмента кода?
int main(void)
{
int n ;
cin >> n ; // get the size of array.
int arr[n] ; // create a variable sized array.
.... do other stuff ...
}
В частности, в случае с массивом:
Массиву назначается непрерывный блок памяти в стеке, и в стеке есть переменные над и под ним, поэтому размер массива должен быть известен так, чтобы переменная над массивом в стеке, сам массив и переменные ниже массив в стеке все может поместиться в памяти аккуратно.Как тогда реализуются массивы переменного размера в стеке? Почему они вообще необходимы? Почему мы не можем просто использовать кучу для буферов переменного размера?
РЕДАКТИРОВАТЬ:
Из комментариев я понимаю, что C и C ++ имеют разные правила относительно того, являются ли VLA стандартными или нет, а также замечание Нила Баттерворта о том, что вообще не стоит задавать вопрос о двух языках одновременно. Спасибо, люди, поэтому я удалил тег C из своего вопроса, поскольку я собирался в основном задавать вопросы о C ++, что видно по синтаксису фрагмента кода. Извините за путаницу, и спасибо за ответы.