Аргумент против VLA заключается в том, что из-за абсолютной опасности переполнения стека к тому времени, когда вы достаточно продумывали / проверяли, чтобы сделать их безопасными, вы уже достаточно продумывали / проверяли, чтобы использовать массив фиксированного размера :
1) Чтобы безопасно использовать VLA, вы должны знать, что достаточно стека.
2) В подавляющем большинстве случаев вы знаете, что стека достаточно, что вы знаете верхнюю границу требуемого size
и знаете (или, по крайней мере, хотите угадать или потребовать) более низкую привязан к доступному стеку, и один меньше другого. Так что просто используйте массив фиксированного размера.
3) В подавляющем большинстве случаев, которые не так просты, вы используете несколько VLA (возможно, по одному на каждый вызов рекурсивной функции) и знаете верхнюю границу их общего количества. размер, который меньше нижней границы доступного стека. Таким образом, вы можете использовать массив фиксированного размера и делить его на части по мере необходимости.
4) Если вы когда-нибудь столкнетесь с одним из оставшихся случаев, в ситуации, когда выполнение malloc
недопустимо, сообщите мне ...
Может быть более удобным, из POV исходного кода, использовать VLA. Например, вы можете использовать sizeof
(в определяющей области действия) вместо сохранения размера в переменной, и для того, чтобы разделить массив на куски, может потребоваться передача дополнительного параметра. Так что иногда есть небольшой выигрыш в удобстве.
Также проще не заметить, что вы используете огромное количество стеков, что приводит к неопределенному поведению, если вместо довольно страшного int buf[1920*1024]
или int buf[MAX_IMG_SIZE]
у вас есть int buf[img->size]
. Это прекрасно работает вплоть до первого раза, когда вы на самом деле обрабатываете большое изображение. В общем, это проблема правильного тестирования, но если вы пропустите некоторые возможные трудные входные данные, то это будет не первый или последний набор тестов, который это сделает. Я обнаружил, что массив с фиксированным размером напоминает мне либо о проверке входных данных с фиксированным размером, либо о замене его динамическим размещением и перестает беспокоиться о том, помещается ли он в стек или нет. Нет действительного варианта положить его в стек, и не беспокоиться, подходит ли он ...