Распределение стека более эффективно.

от вопрос уже есть ответ здесь:

массив переменных размера 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 ++, что видно по синтаксису фрагмента кода. Извините за путаницу, и спасибо за ответы.

Ответы на вопрос(1)

Ваш ответ на вопрос