Какая польза от передачи константных ссылок на примитивные типы?

StackOverflow https://stackoverflow.com/questions/672700

Вопрос

В проекте, который я поддерживаю, я вижу много такого кода для простого get/set методы

const int & MyClass::getFoo() { return m_foo; }

void MyClass::setFoo(const int & foo) { m_foo = foo; }

Какой смысл делать это вместо следующего?

int MyClass::getFoo() { return m_foo; }  // Removed 'const' and '&' 

void MyClass::setFoo(const int foo) { m_foo = foo; }  // Removed '&'

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

Это было полезно?

Решение

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

const &int x = myObject.getFoo();
cout<<x<<endl;
//...
cout<<x<<endl;//x might have changed

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

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

void test1(int x)
{
  cout<<x<<endl;//prints 1
}

void test2(const int &x)
{
  cout<<x<<endl;//prints 1 or something else possibly, another thread could have changed x
}

int main(int argc, char**argv)
{
  int x = 1;
  test1(x);
  //...
  test2(x);
  return 0;
}

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

Другие советы

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

Константные ссылки следует использовать только для сложных классов, когда копирование объектов может стать проблемой производительности.В случае примитивов, если вам не нужно изменить значение переменной, вам не следует передавать ссылка.Причина в том, что Рекомендации требуют больше времени вычислений, чем не ссылки, поскольку с Рекомендации, программе необходимо просмотреть таблицу, чтобы найти адрес объекта.Когда это время поиска короче времени копирования, ссылки становятся улучшением.

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

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

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

Пользы особой нет.Я видел это раньше в геттерах и сеттерах, сгенерированных фреймворком или макросом.Макроскод не различал примитивные и не-POD типы и просто использовал const type& по всем направлениям для сеттеров.Я сомневаюсь, что это вопрос эффективности или настоящее недоразумение;скорее всего, это проблема последовательности.

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

Нет никакого смысла и пользы, кроме

void MyClass::setFoo(const int foo)
void MyClass::setFoo(const int& foo)

так как тогда вы не сможете повторно использовать переменную «foo» внутри реализации «setFoo».И я считаю, что 'int&' - это просто потому, что Гай просто привык передавать все по константной ссылке, и в этом нет ничего плохого.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top