Оценивается ли условие в цикле `for` диапазона C++11 на каждой итерации?
Проблема с вызовом метода в цикле
В коде у меня есть следующий фрагмент:
for(auto& entity : memoryManager.getItems())
entity->update(mFrameTime);
У меня возник вопрос: если memoryManager
содержит 1000 элементов, будет ли memoryManager.getItems()
вызываться 1000 раз (при каждой итерации цикла) или только один раз в начале цикла?
Также меня интересует, применяет ли компилятор какие-либо оптимизации при использовании флагов -O2
или -O3
?
Для справки, memoryManager.getItems()
возвращает std::vector<Entity*>&
.
1 ответ(ов)
В соответствии со стандартом, оператор for
с диапазоном оценивается только один раз. Он определяется как эквивалентный следующему коду:
{
auto && __range = range-init;
for ( auto __begin = begin-expr, __end = end-expr; __begin != __end; ++__begin ) {
for-range-declaration = *__begin;
statement
}
}
Где range-init
— это выражение (вместе с окружением в круглых скобках) или инициализатор с фигурными скобками, находящийся после двоеточия.
Когда действительно стоит использовать noexcept?
Возможно ли вывести тип переменной в стандартном C++?
Почему `std::initializer_list` не поддерживает оператор подиндексации?
Почему объект, возвращаемый по значению, имеет тот же адрес, что и объект внутри метода?
Можно ли вручную определить преобразование для класса enum?