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