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