Рассмотрим пример:
if (flag)
for (condition)
do_something();
else
for (condition)
do_something_else();
Если flag не изменяется внутри циклов for, это должно быть семантически эквивалентно:
for (condition)
if (flag)
do_something();
else
do_something_else();
Только в первом случае код может быть намного длиннее (например, если используется несколько циклов for или если do_something() является кодовым блоком, который в основном идентичен do_something_else()), а во втором случае, флаг проверяется много раз.
Мне любопытно, смогут ли текущие компиляторы С++ (а главное g++) оптимизировать второй пример, чтобы избавиться от повторных тестов внутри цикла for. Если да, то при каких условиях это возможно?