2014-12-19 2 views
3

мне было интересно ... есть ли реальная разница между:для (авто и указатель: vectorOfPointers) против (авто для указателя: vectorOfPointers)

for(auto &pointer : vectorOfPointers){pointer->fun();} 

и

for(auto pointer : vectorOfPointers){pointer->fun();} 

где vectorOfPointers объявляется простым vector нормальных указателей старой школы:

std::vector<SomeType *> vectorOfPointers; 

?

Я знаю, что & в for(auto &o : objects) стоит для справки, в то время как for(auto o : objects) является цикл по значениям. Но «значения» в моих примерах сами указатели - я могу получить доступ к объектам, к которым они указывают, и изменять их с помощью обоих циклов.

Итак, есть ли разница? Если «не совсем» (как в использовании, так и в том, что компилятор будет генерировать из них), возможно, один из этих двух вариантов является широко используемым/утвержденным?

Не позволяйте добавить умные указатели на эту дискуссию, меня интересует именно точная ситуация.

+1

Я помню, как Стефан Т. Лававей из Microsoft упоминал в разговоре о конференции, что второй вариант - преждевременная пессимизация. По его словам, цикл by-value всегда медленнее, даже для контейнеров 'int'. К сожалению, я не на 100% уверен, что это было так, поэтому на данный момент ссылки на эту цитату :( – ComicSansMS

+0

@ComicSansMS это совсем новая информация для меня, спасибо. Ps Я люблю твой ник. – PolGraphic

ответ

4

Итак, есть ли разница?

В этом конкретном примере нет; обе петли выполняют одно и то же, и должны производить (более или менее) один и тот же код.

В более общем смысле, ссылка, не содержащая константы, позволяет изменять векторные элементы. Копия не работает, но (для сложных типов) может быть менее эффективной и требует, чтобы тип был скопирован.

Возможно, один из этих двух вариантов является широко используемым/утвержденным?

Я использую то же эмпирическое правило, что и для параметров функции: путем ссылки не const, только если я хочу разрешить модификацию; в противном случае - по значению для простых типов или по ссылке const для сложных или не копируемых типов.

+0

Спасибо, я был сосредоточен на работая на заостренных объектах, и я пропустил часть о модификациях указателей. И правило, когда использовать какой из них просто и логично :) – PolGraphic

1

В первом случае у вас есть ссылки на указатели в вашем векторе. Во втором случае у вас есть копии указателей из вашего вектора. Если вы должны были изменить pointer, только в первом случае указатели внутри вашего вектора также будут изменены.

Тот факт, что ваш вектор содержит указатели, действительно, помимо точки. Такое поведение не меняется.

Смежные вопросы