FontSepten
@FontSepten
Любитель

Параметр ссылка VS Параметр указатель. Что лучше?

В книге "Учимся программировать на языке С++ К.Джамса", упоминается изменение переменных через параметр функций.
В книге было показано два способа:
1. Через параметр-указатель
void Свап(int* a, int* b)
{
	int буфер;

	буфер = *a;
	*a = *b;
	*b = буфер;
}

int main()
{
	int a = 90, b = 70;
	cout << a << " " << b << endl;

	Свап(&a, &b);

	cout << a << " " << b << endl;
}


2. Через параметр-ссылку
void Размен(int &a, int &b)
{
	int буфер = a;
	a = b;
	b = буфер;
}

int main()
{
	int a = 80, b = 10;
	cout << a << " " << b << endl;
	Размен(a, b);
	cout << a << " " << b << endl;
}

(При этом в книге было указано, что в параметр-ссылку нужно вставлять не просто переменную, а ссылку на нее, но я не увидел разницы, на что это может повлиять?)

В чем разница в методе/скорости/памяти между этими 2 способами? И какой объективно лучше?
  • Вопрос задан
  • 184 просмотра
Решения вопроса 1
gbg
@gbg Куратор тега C++
Любые ответы на любые вопросы
Указатель дает вам (якобы) большую гибкость - потому что можно передать туда nullptr и изменить тем самым логику работы вызываемой функции - вроде как сказать "мне этот параметр не интересен, его можно не считать". Эта практика пришла из C, в котором нет перегрузки функций.

Но! В некоторых случаях, это создает проблему - если передать nullptr в функцию, которая всегда ожидает указатель (и не проверяет на null) - программа крашнется.

Ссылка же позволяет гарантировать, что значение передано и его можно не проверять на nullptr - таким образом, ошибки времени выполнения можно сместить на время компиляции, что очень даже хорошо.

Теперь о быстродействии - тут все плохо с однозначным ответом, который вы, автор вопроса, хотите получить. Дело в том, что компиляторы-оптимизаторы C++ нынче настолько умные, что они могут, в зависимости от контекста, сделать полностью идентичный код для ссылок и указателей, так что ответить на ваш вопрос с гарантией невозможно. Однако, вероятность того, что ссылка оптимизируется лучше чем указатель все же есть - потому что компилятор всегда уверен, что ссылка на что-то смотрит.

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

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

Войдите, чтобы написать ответ

Похожие вопросы