Даже если функции встроены, вы не можете рассчитывать на то, что компилятор правильно оптимизирует цикл, если вложенный код достаточно велик / сложен. Это потому, что семантически , вы, вероятно, не ожидаете, что значение end()
будет меняться на каждой итерации цикла, поэтому его следует вычислять только один раз и. Однако компилятор может быть не в состоянии дать такую гарантию, основываясь на соображениях псевдонимов и других условиях отказа в оптимизаторе. Если - как и другие авторы ответили - вы предварительно вычислили end()
и сохранили его в переменной, компилятор с меньшей вероятностью запутается.
Например:
typedef std::vector<int> intvec;
intvec v = external_function();
for (intvec::const_iterator vi = v.begin(); vi != v.end(); ++vi) {
call_external_function(v, *vi);
}
С точки зрения компилятора, call_external_function()
может изменить размер вектора. Если вы знаете, что это не может произойти, вы должны сообщить компилятору так:
for (intvec::const_iterator vi = v.begin(), ve = v.end(); vi != ve; ++vi) {
call_external_function(v, *vi);
}