Глядя на этот вопрос: Почему компилятору C / C ++ нужно знать размер массива во время компиляции? мне пришло в голову, что у разработчиков компилятора должно было быть несколько раз, чтобы промокнуть ноги сейчас (это часть стандарта C99, это 10 лет назад) и обеспечивает эффективные реализации.
Однако все же кажется (из ответов) дорогостоящим.
Это меня как-то удивляет.
Конечно, я понимаю, что статическое смещение намного лучше динамического с точки зрения производительности, и в отличие от одного предложения, я бы на самом деле не дал компилятору выполнить выделение массива кучи, поскольку это, вероятно, будет стоить еще дороже [ это не было измерено;)]
Но я все еще удивлен предполагаемой стоимостью :
- если в функции нет VLA, то, насколько я вижу, не будет никаких затрат.
- если есть один VLA, то можно либо поместить его до, либо после всех переменных, и, следовательно, получить статическое смещение для большей части стекового кадра (или мне так кажется, но я не очень разбираюсь в этом) в управлении стека)
Конечно, возникает вопрос о нескольких VLA, и мне было интересно, сработает ли выделенный стек VLA. Это означает, что VLA будет представлен счетчиком и указателем (следовательно, известных размеров) и фактической памятью, занятой во вторичном стеке, используемом только для этой цели (и, следовательно, действительно в стеке).
[перефразируя]
Как VLA реализованы в gcc / VC ++?
Неужели стоимость действительно впечатляет?
[перефразировать конец]
Мне кажется, что это может быть лучше, чем, скажем, использование vector
, даже с существующими реализациями, поскольку вы не несете затрат на динамическое распределение (за счет отсутствия изменения размера).
EDIT:
Здесь есть частичный ответ здесь , однако сравнение VLA с традиционными массивами кажется несправедливым. Если бы мы знали размер заранее, то нам не понадобился бы VLA. В том же вопросе AndreyT дал несколько указаний относительно реализации, но это не так точно, как хотелось бы.