ссылка на переменную в C ++ - PullRequest
1 голос
/ 11 июня 2011

В этой статье говорится, что ссылки позволяют сократить объем копирования за кулисами.Уменьшает ли ссылка какие-либо другие операции по сравнению с переменной?

Ответы [ 6 ]

1 голос
/ 11 июня 2011

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

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

It is unspecified whether or not a reference requires storage (3.7).

Ссылки позволяют передавать аргументы «по ссылке», а не «передаются копией».

void f(int & r) { r = 1; }
void g(int const * p) { *p = 2; }
void h(int j) { j = 3; }
int main()
{
  int i = 0;
  f(i);  // i now equals 1
  g(&i); // i now equals 2 (the address of i was given to g)
  h(i); // i is copied and thus not modified (ie i == 2 after this line)
}

См. Также C ++ faqlite: ссылки .

1 голос
/ 11 июня 2011

Ссылка является разновидностью переменной. Вы спрашиваете о передаче по ссылке, а не по значению.

Передача по значению создает копию передаваемого значения, тогда как передача по ссылке означает, что получатель сможет изменить ту же переменную, значение которой вы передали.

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

0 голосов
/ 11 июня 2011

Нет. Экономия применяется только к копированию esp.when при передаче в качестве аргумента функции и возвращении значения из функции.

0 голосов
/ 11 июня 2011

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

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

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

0 голосов
/ 11 июня 2011

Если вас беспокоит использование памяти, просто подумайте о передаче по ссылке как передаче по значению с указателем, с грязной работой, выполненной за кулисами. Объем памяти, используемой указателем, зависит от платформы / ОС.

0 голосов
/ 11 июня 2011

Идея ссылки как переменной:

 const int & r = 42;

в принципе неправильно. Хорошо, вы можете создавать такие вещи, но изначально ссылки предназначались для облегчения передачи объектов в функции и (в меньшей степени) возврата их из функций. Если вы используете их в любом другом контексте, кроме случаев, когда вы намного, намного умнее меня или большинства других программистов, вы делаете это неправильно.

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