Циклы

15.12.2010
15
0
#1
Предположим, используется цикл for(;:) такого вида:
for ( unsigned int i = 0; i<func(); i++ )
{
...
}

где, func() - функция возвращающая некое значение типа unsigned int.

Перед следующей итерацией производится проверка условия i<func(), вот интересно, func() будет вычисляться каждый раз, или ее значение сохраняется, при условии что в теле цикла НЕ происходит изменения переменных как-либо влияющих на результат func().
ведь если в func() выполняются большие(ресурсоёмкие) вычисления то цикл будет ждать этих операций понапрасну? Причем, аналогично и с do{}while().

спасибо.
 
R

rrrFer

Гость
#2
func() будет вызываться каждый раз, поэтому так как написали Вы делать не рекомендуется. Есть хорошие книги по чистому коду, об этом пишут почти все в интернете и современном мире )

Теоретически, компилятор может оптимизировать такой вызов функции, но вряд-ли он это сделает даже с флагами оптимизации. Почему?
-впринципе он может определить что цикл не изменяет аргументов функции func(), для этого ему достаточно выделить участок цикла и проанализировать зависимости по данным. def-use граф даст ответ.
-однако, вдруг в цикле изменяются глобальные переменные, которые использует func(), или наоборот - функция имеет побочный эффект? - такую штуку анализировать гораздо сложнее и компилятор этого скорее всего не сделает в более менее реальном примере. Но чтобы компилятор попробовал оптимизировать надо функцию объявить как inline - тогда он залезет в нее, иначе он и пробовать небудет.

Вывод: говнод писать не стоит,надеяться на компилятор тоже, тем более, что не все компиляторы оптимизируют одинаково хорошо(это к вопросу о переносимости такого кода)

Добавлено: ЗЫ. Ваши вопросы не очень унылы, в отличии от 99% других :( Спрашивайте еще. А можно и в аську написать.
 
15.12.2010
15
0
#3
Спасибо!
func() будет вызываться каждый раз, поэтому так как написали Вы делать не рекомендуется. Есть хорошие книги по чистому коду, об этом пишут почти все в интернете и современном мире )
...
не по глазам, видать :rolleyes:
...
Вывод: говнод писать не стоит,надеяться на компилятор тоже, тем более, что не все компиляторы оптимизируют одинаково хорошо(это к вопросу о переносимости такого кода)
...
Занимаюсь программированием недавно, но быстро понял что на компилятор надежда только при опечатках))
Вот наглядный пример.
Юзаю VC++ 6.0.
Компилил под XP один проект. была ошибка Access Violation, не углубляясь в причину ошибки ,скажу что долго с ней воевал, однако не исправив её, я запустил компилятор под семеркой, и, о чудо, ошибки наруния прав доступа не стало!)))....
...
Добавлено: ЗЫ. Ваши вопросы не очень унылы, в отличии от 99% других :) Спрашивайте еще. А можно и в аську написать.
хорошо. :huh: