Производительность pIter! = Cont.end () в цикле for
В последнее время Херб Саттер проходил через «Исключительный C ++», и у меня есть серьезные сомнения относительно конкретной рекомендации, которую он дает в пункте 6 - Временные объекты.
Он предлагает найти ненужные временные объекты в следующем коде:
string FindAddr(list<Employee> emps, string name)
{
for (list<Employee>::iterator i = emps.begin(); i != emps.end(); i++)
{
if( *i == name )
{
return i->addr;
}
}
return "";
}
В качестве одного из примеров он рекомендует предварительно вычислить значениеemps.end()
перед циклом, поскольку на каждой итерации создается временный объект:
Для большинства контейнеров (включая список) вызов end () возвращает временный объект, который должен быть создан и уничтожен. Поскольку значение не изменится, повторное вычисление (и восстановление и переопределение) его на каждой итерации цикла является излишне неэффективным и неэстетичным. Значение должно быть вычислено только один раз, сохранено в локальном объекте и использовано повторно.
И он предлагает заменить следующим:
list<Employee>::const_iterator end(emps.end());
for (list<Employee>::const_iterator i = emps.begin(); i != end; ++i)
Для меня это ненужное осложнение. Даже если один заменит некрасивые объявления типа компактнымиauto
он по-прежнему получает две строки кода вместо одной. Более того, у него есть этоend
переменная во внешней области видимости.
Я был уверен, что современные компиляторы все равно оптимизируют этот кусок кода, потому что я на самом деле используюconst_iterator
здесь и легко проверить, как содержимое цикла каким-то образом обращается к контейнеру. Компиляторы стали умнее за последние 13 лет, верно?
Во всяком случае, я предпочту первую версию сi != emps.end()
в большинстве случаев, когда я не очень беспокоюсь о производительности. Но я хочу знать наверняка, является ли это своего рода конструкцией, которую я мог бы положиться на компилятор для оптимизации?
Обновить
Спасибо за ваши предложения о том, как сделать этот бесполезный код лучше. Обратите внимание, мой вопрос о компиляторе, а не о методах программирования. Единственные соответствующие ответы на данный момент отNPE а такжеEllioh.