Первая версия может быть излишне дорогой, поскольку она основывается на создании копии объекта в векторе. Если myType
не является каким-то очень маленьким и простым объектом, например int
, хранение ссылки может быть лучшей идеей. Он также должен быть объявлен , когда вам нужно , и не раньше, чтобы ограничить проблемы с наложением имен, которые могут , иначе компилятор будет выдавать менее эффективный код:
vector<myType> myVec;
for(int i = 0; i < 1000000; i ++ )
{
myType& current = myVec[ i ];
doSomethingWith( current );
doAlotMoreWith( current );
messAroundWith( current );
checkSomeValuesOf( current );
}
Одним из преимуществ создания копии вместо использования ссылки является то, что это может привести к тому, что компилятор загружает объект в регистр, а не считывает его из памяти при каждом обращении. Так что обе версии стоит попробовать.
Любое, конечно, рекомендация "Копировать против справочника" также применима к каждой из ваших функций Они принимают аргумент по значению или по ссылке? В зависимости от того, что они делают с ним и как определяется myType
, один может быть быстрее другого.
Вторая версия имеет недостатки, поскольку она (если компилятор не может ее оптимизировать) требует, чтобы объект просматривался в памяти каждый раз. В зависимости от вашей реализации STL, могут также быть некоторые издержки из-за проверки границ на operator[]
.
Сначала необходимо создать временное имя, которое затем передается каждой из ваших функций. Вопрос в том, должно ли это временное значение иметь тип значения (myType
) или ссылочный тип (myType&
/ const myType&
)
Другой вариант, который может заслуживает изучения, - это помещение каждого вызова функции в отдельный цикл. Это в некоторой степени вредит локальности данных, но если некоторые функции используют много локальных данных, они могут работать лучше. Это может также играть лучше с кешем инструкций.
Но на самом деле производительность чрезвычайно сложна. Кэширование, выполнение вне порядка, точная семантика myType
(особенно его конструктор копирования и размер) и количество оптимизаций, выполняемых компилятором, все нам неизвестны. Таким образом, мы не можем дать вам надежный ответ.
Угадай, кто может: твой компилятор. Написать тест. Попробуйте оба. Время результаты. Выберите более быстрый.