В настоящее время я обновляю какой-то старый код C ++, который у меня есть, который перебирает типы контейнеров STL, и я нахожу много такого кода:
if (!edgeSet.empty())
{
for(typename EdgeSet::const_iterator iter = edgeSet.begin(); iter != edgeSet.end(); iter++)
{
...
}
}
Который я переворачиваю (успешно)в эквивалент:
if (!edgeSet.empty())
{
for(auto& edge : edgeSet)
{
...
}
}
И мне было интересно ... проверка "empty
" необходима для "диапазона для"?Я полагаю, что в более старом «стиле итератора» цикла for необходимо избегать бесполезной инициализации и сравнения / ветвления, но мне любопытно, будет ли «range for» автоматически выполнять пустую проверку или нет еще до того, как он запустится.
Далее, если оптимизация действительно происходит, происходит ли она на всех уровнях оптимизации (включая отсутствие оптимизации: -O0
)?
Заранее спасибо.