На мой взгляд, alloca (), если он доступен, должен использоваться только ограниченным образом. Очень похоже на использование «goto», довольно большое количество разумных людей сильно отрицают не только использование, но и наличие alloca ().
Для встроенного использования, когда размер стека известен, и ограничения могут быть наложены с помощью соглашения и анализа размера выделения, и когда компилятор не может быть обновлен для поддержки C99 +, использование alloca () хорошо, и я Известно, что его использовали.
Когда доступно, VLA могут иметь некоторые преимущества по сравнению с alloca (): компилятор может генерировать проверки предела стека, которые будут перехватывать доступ за пределами границ при использовании доступа в стиле массива (я не знаю, делают ли это какие-либо компиляторы, но это может быть сделано), и анализ кода может определить, правильно ли ограничены выражения доступа к массиву. Обратите внимание, что в некоторых средах программирования, таких как автомобильное, медицинское оборудование и авионика, этот анализ должен выполняться даже для массивов фиксированного размера, как автоматического (в стеке), так и статического распределения (глобального или локального).
В архитектурах, в которых хранятся как данные, так и адреса возврата / указатели фреймов в стеке (насколько я знаю, это все из них), любая переменная, выделенная в стеке, может быть опасной, поскольку адрес переменной может быть взят, и непроверенный ввод значения могут разрешить все виды вреда.
Переносимость менее важна во встроенном пространстве, однако это хороший аргумент против использования alloca () вне тщательно контролируемых обстоятельств.
За пределами встроенного пространства для эффективности я использовал alloca () в основном внутри функций ведения журналов и форматирования, а также в нерекурсивном лексическом сканере, где временные структуры (выделяемые с помощью alloca () создаются во время токенизации и классификации, затем постоянный объект (выделенный с помощью malloc ()) заполняется перед возвратом функции. Использование alloca () для небольших временных структур значительно уменьшает фрагментацию при выделении постоянного объекта.