указатели — Когда переменные копируются при передаче в качестве аргументов в C ++?

Возможный дубликат:
Как справка реализована внутри?

void f (int& a)
{
a ++;
}

int main ()
{
int b = 5;
f(b);
cout << b << endl; //prints 6
}

Когда я увидел синтаксис для ссылок в C ++, он первоначально выглядел так, как будто переменная b (если бы это был объект) была бы скопирована в f. Как эти ссылки на самом деле работают под капотом? (Какой-нибудь простой asm был бы великолепен.)

0

Решение

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

Когда я увидел синтаксис для ссылок в C ++, он первоначально выглядел так, как будто переменная b (если бы это был объект) была бы скопирована в f.

Нету. Это один из достоинств ссылок — без копирования.

    f(b);
00DF1405  lea         eax,[b]
00DF1408  push        eax
00DF1409  call        f (0DF1177h)
00DF140E  add         esp,4

eax будет содержать адрес b, а затем помещается в стек аргументов функции.

3

Другие решения

Под капотом в C ++ ссылки реализованы в точности как указатели. Единственное отличие — некоторые проверки времени компиляции и другой синтаксис.
Таким образом, в вашем случае функция f получает «указатель» на целое число b и увеличивает значение b.

2