Циклы

Тема в разделе "Общие вопросы по С и С++", создана пользователем Antonim, 7 июн 2012.

  1. Antonim

    Antonim Member

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

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

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

    спасибо.
     
  2. rrrFer

    rrrFer Well-Known Member
    Команда форума C\C++ Team

    Регистрация:
    6 сен 2011
    Сообщения:
    1.324
    Симпатии:
    36
    func() будет вызываться каждый раз, поэтому так как написали Вы делать не рекомендуется. Есть хорошие книги по чистому коду, об этом пишут почти все в интернете и современном мире )

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

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

    Добавлено: ЗЫ. Ваши вопросы не очень унылы, в отличии от 99% других :( Спрашивайте еще. А можно и в аську написать.
     
  3. Antonim

    Antonim Member

    Регистрация:
    15 дек 2010
    Сообщения:
    15
    Симпатии:
    0
    Спасибо!
    не по глазам, видать :rolleyes:
    Занимаюсь программированием недавно, но быстро понял что на компилятор надежда только при опечатках))
    Вот наглядный пример.
    Юзаю VC++ 6.0.
    Компилил под XP один проект. была ошибка Access Violation, не углубляясь в причину ошибки ,скажу что долго с ней воевал, однако не исправив её, я запустил компилятор под семеркой, и, о чудо, ошибки наруния прав доступа не стало!)))....
    хорошо. :huh:
     
Загрузка...
Похожие Темы - Циклы
  1. Maddy101d
    Ответов:
    3
    Просмотров:
    1.014
  2. Homka
    Ответов:
    12
    Просмотров:
    2.877
  3. Smile1995
    Ответов:
    2
    Просмотров:
    1.134

Поделиться этой страницей