В последнее время я получал "Исключительный С++" Херба Саттера, и у меня есть серьезные сомнения в отношении конкретной рекомендации, которую он дает в пункте 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() возвращает временный объект, который должен быть построен и уничтожен. Поскольку значение не изменится, пересчет (и восстановление и redestroying), он на каждой итерации цикла тоже бесполезен неэффективен и неэстетичен. Значение должно вычисляться только один раз, хранится в локальном объекте и повторно используется.
И он предлагает заменить следующим:
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.