Преобразовывают ли основные компиляторы базовые типы, передаваемые по ссылке, в передаваемые по копии?

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

А как насчет базовых типов, таких как int ? Передача адреса в int и использование его внутри функции будет медленнее, чем передача его копированием, потому что перед использованием указатель необходимо разыменовать.

Как современный компилятор обрабатывает это?

int foo(const int & i)
{
   cout << i; // Do whatever read-only with i.
}

Могу ли я доверить им компилировать это в это?

int foo(const int i)
{
   cout << i;
}

Кстати, в некоторых случаях может быть даже быстрее передать оба i и & i , затем используйте i для чтения и * i для записи.

int foo(const int i, int * ptr_i)
{
   cout << i;    // no dereferencement, therefore faster (?)
   // many more read-only operations with i.
   *ptr_i = 123;
}
7
задан Gabriel 31 October 2011 в 18:51
поделиться