2016-12-15 1 views
1

Рассмотримконстантную ссылку инициализацию переменной

int foo() 
{ 
    return 1; 
} 

main() 
{ 
    const auto v1 = foo(); 
    const auto &v2 = foo(); 
} 

Каковы различия между этими двумя const инициализации переменной, в любом аспекте, включая производительность? Есть ли ситуация, когда кто-то предпочитает других?

+0

«Преждевременная оптимизация - корень всех злых» – Slava

+0

@ СЛАВА весь этот язык - это все о микро оптимизации. – grisevg

+0

@grisevg Я не согласен. Прежде всего, совершенно неважно, насколько быстро работает некорректная программа. Поэтому сначала читаемость, затем микропомимизация и только там, где это необходимо. – Slava

ответ

0

Const авто v1 = Foo()

Это создает константную переменную v1. Как сказано, создается означает, что любые возвраты foo() теперь сохраняются в v1.

Const авто & v2 = Foo()

является ссылкой на константным, Foo() должен возвращать ссылку. Если какой-либо возврат foo() не поддерживает семантику перемещения, то const auto & v2 будет быстрее.

P.S. В вашем случае, поскольку foo() возвращает int, это не имеет значения.

+0

Как я уже сказал в своем ответе, в этом случае 'const auto & v2 = foo()' очень опасен и его следует избегать, если вы не хотите использовать расширенное время жизни временного и хорошо понимаете, как он работает. – grisevg

+1

Временная переменная, к которой относится константа, не будет уничтожена до тех пор, пока v2 не выйдет из сферы действия. Проверьте это для получения более подробной информации https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

-1

Я был бы осторожен и избежал бы ссылки на временный (kudos to A.N. для ссылки https://herbsutter.com/2008/01/01/gotw-88-a-c....). Его можно было бы легко изменить позже до auto &v2 = foo();, что является неопределенным поведением.

Скотт Мейерс и Херб Саттер рекомендуют возвращать объекты, созданные по стеку, по значению. Вы можете использовать Оптимизацию возвращаемого значения имен (NRVO), чтобы обеспечить оптимальную производительность, которая на самом деле будет быстрее, чем возврат к временной или семантике перемещения.

Я не говорю, чтобы никогда не продлевать время жизни на константных ссылках, я уверен, что могут быть случаи, когда это имеет смысл, например, когда NRVO не может быть сделано, все, что я говорю, - это избегать это, если нет веской причины. Это не очень хорошо известная функция, и это может привести к опасному коду.

ОБНОВЛЕНО: Исправлено, что const auto &v2 = foo(); действительно действительный код, но добавил объяснение, почему его все равно следует избегать. Также добавлена ​​ссылка, описывающая NRVO.

+0

. Тогда почему VS2012 даже не предупреждает об этом? – user6386155

+1

Ни один из компиляторов не будет жаловаться, потому что это const. Проверьте этот https://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/ –

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