C ++ итераторы и оптимизация цикла - PullRequest
46 голосов
/ 28 апреля 2009

Я вижу много кода на C ++, который выглядит следующим образом:

for( const_iterator it = list.begin(),
     const_iterator ite = list.end();
     it != ite; ++it)

В отличие от более сжатой версии:

for( const_iterator it = list.begin();
     it != list.end(); ++it)

Будет ли разница в скорости между этими двумя соглашениями? Наивно первый будет немного быстрее, так как list.end () вызывается только один раз. Но поскольку итератор является константным, создается впечатление, что компилятор извлечет этот тест из цикла, создавая эквивалентную сборку для обоих.

Ответы [ 11 ]

0 голосов
/ 28 апреля 2009

Теоретически, компилятор может оптимизировать вторую версию до первой (очевидно, что контейнер не изменяется во время цикла).

На практике я обнаружил несколько похожих случаев при профилировании критичного по времени кода, когда мой компилятор полностью не смог вывести инвариантные вычисления из условий цикла. Поэтому, хотя в большинстве случаев и более лаконичная версия подходит, я не полагаюсь на то, что компилятор делает с ней какие-то разумные действия для случая, когда меня действительно беспокоит производительность.

...