C ++ - постоянное значение для ссылочного параметра? - PullRequest
3 голосов
/ 14 января 2012

Обычно значения параметров копируются при передаче.Использование ссылки может сэкономить память, особенно для больших структур.Однако в этом случае:

void foo( int parameter = 7 );
void bar( const int& parameter = 7 );

во втором объявлении, что именно он будет делать при использовании значения по умолчанию?То, что происходит, когда постоянное значения используется для опорного параметра?

void foo( const int& parameter ) { }
...
foo( 7 );

есть ли разница в эффективности между ссылкой и скопированным значением, когда Contantзначение используется?

Ответы [ 2 ]

3 голосов
/ 14 января 2012

1) Это будет делать то же самое, как если бы это не было const&. Вы не можете изменять параметры const&, поэтому вы можете связать их с константами 1 .

2) Может быть очень крошечная разница в эффективности, потому что вы действительно (возможно, зависит от реализации) передаете указатель на значение вместо значения, так что вам придется разыменовывать указатель, чтобы добраться до реального значения. (Опять же, компилятор мог видеть, что передача int по ссылке на константу - пустая трата времени, поэтому он будет передавать вещь по значению и делать вид, что это по ссылке. Вы не можете знать.) Эта жертва может стоит больших конструкций, но обычно вам не нужно передавать что-то вроде int по константной ссылке.

<ч /> 1 mcmcc указал, что в случае целочисленных литералов вы действительно привязывает ссылку к месту в стеке (например, в отличие от строковых литералов, которые находятся в статической памяти).

2 голосов
/ 14 января 2012

Ссылки на const являются специальными: они продлевают время жизни временных объектов.

Сравнить:

struct Foo { Foo(int, int) { } };

{
   Foo(1,2);                  // dies!

   const Foo & f = Foo(3,3);  // lives...

   // ...
}                             // ... now it's dead

Таким же образом, если вы не предоставите целое число, создается временное целое число, и его время жизни увеличивается до продолжительности вызова функции в силу привязки к parameter.

См. Херб Саттер ПОЛУЧИЛ # 88 .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...