В компиляторах pre-C99 для каждой итерации часто использовалось одно и то же пространство стека, поэтому на самом деле не было влияния на производительность для объявления переменной в цикле, поскольку не требовалось выделять больше пространства стека во время последовательных итераций , Я думаю, что компиляторы C99 делают что-то подобное, но я точно не знаю.
Большинство компиляторов просто оптимизируют это. Хуже всего то, что вы создаете новый флоат в стеке, что является чрезвычайно недорогой операцией на большинстве архитектур. Могут быть случаи, когда еще быстрее объявлять переменную непосредственно перед использованием. Хотя, если ваша программа чувствительна к производительности, для начала вам, вероятно, следует использовать язык ассемблера.
C99 и более поздние версии указывают, что переменные привязаны к циклу, в котором они созданы, в то время как более ранние версии C неоднозначны. Различные компиляторы реализуют его по-разному. Это важно знать, потому что вы можете столкнуться с конфликтами именования в компиляторах pre C99, если переменная с тем же именем существует в области функции, содержащей цикл (поскольку они будут обрабатывать переменную как область действия функции).
Лично я объявляю переменные в цикле все время. Он хорошо работает и четко указывает, что переменные существуют для использования в этом цикле. Это вопрос структурирования вашего кода таким образом, который четко указывает на намерения этого кода.
Что это такое -03 и -01? –
@O_O: Уровни оптимизации в GCC, '-O1' через' -O3' (это буква O, а не число 0) говорят компилятору оптимизировать код от «немного» до «довольно много». '-Os' инструктирует компилятор оптимизировать размер кода. См. Http://stackoverflow.com/questions/1778538/how-many-gcc-optimization-levels-are-there – nmichaels
Это флаги оптимизации. Чем больше число, тем больше фокусов. Но трюки также могут иметь недостатки: оптимизированная сборка может быть быстрее, но больше, а отлаживаемый (высоко) оптимизированный код может быть сложнее, так как соотношение 1: 1 с кодом C еще далеко. – mvds