Производительность 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.

Ответы на вопрос(7)

Ваш ответ на вопрос