Не только, как вы правильно сказали
VLA официально не поддерживаются в C ++.
, но они также были переведены в "опциональную функцию" начиная с C11 (хотя они были добавлены только в C99!). Это на самом деле причина не использовать их, чтобы иметь переносимый код.
Детали его выделения памяти, к сожалению, зависят от реализации . Они обычно распределяются в стеке большинством компиляторов как автоматические c переменные хранения (согласно моему исследованию и моему личному опыту), но также могут быть размещены в куче.
Распределение массивов в стеке может привести к проблемам переполнения стека, особенно во встроенной среде. Я предлагаю посетить этот вопрос (о том, что VLA не поддерживается в стандартах C ++); в частности, действительно интересно этот ответ , @Quuxplusone (enphasis is my):
Массивы переменной длины в C99 были в основном ошибкой. Чтобы поддерживать VLA, C99 пришлось пойти на [...] уступки здравому смыслу.
Менее важно в мире C ++, но чрезвычайно важно для целевой аудитории C встраиваемых систем. -системным программистам объявлять VLA означает разбивать произвольно большой кусок вашего стека. Это гарантированное переполнение стека и cra sh. (Каждый раз, когда вы объявляете int A[n]
, вы неявно утверждаете, что у вас есть 2 ГБ стека для резервирования. В конце концов, если вы знаете, что n определенно меньше чем 1000 здесь ", тогда вы просто объявите int A[1000]
.
Насколько я вижу, их главное преимущество - наличие массивов переменной длины с local scope , чего нельзя достичь с помощью его альтернатив:
/* Fixed length array, either global or local */
int arr[100];
/* Dynamic allocation */
int * arr = malloc (100 * sizeof (int));
В большинстве случаев, в любом случае, разработчик либо
- знает, какой максимальный размер может иметь VLA. Так почему бы не выделить его статически с фиксированной длиной?
- Не контролирует максимальный размер, поэтому им придется выполнять проверку работоспособности, чтобы избежать переполнения стека. Так почему бы не ограничить его размер с помощью фиксированной длины? ?