Почему ассемблерной код для ссылки и указателя одинаковый?

113
11 сентября 2019, 20:10

C++:

    void f(int *ptr)
    {
       *ptr;
    }
    void f(int &ptr)
    {
       ptr;
    }

ASM:

f(int*):
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        pop     rbp
        ret
f(int&):
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        pop     rbp
        ret

Почему ассемблерной код для ссылки и указателя одинаковый?

Answer 1

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

Answer 2

И ссылка и указатель - обеспечиваю програмисту доступ к обьекту используя адрес в памяти. Поэтому при одинаковых попытках обратится к обьекту или его полям - приведут к генерации одинакового кода.

1.Например void f(int *ptr){*ptr;} равнозначно void f(int &ptr){ptr;}

2.void f(int *ptr){ptr;} равнозначно void f(int &ptr){&ptr;}

3.void f(obj*p){p->toStr();}равнозначноvoid f(obj& p){p.toStr();}

Запись разная - а значение - одинаковое. Есть правда некоторые особенности, но они не влияют на то какой код сгенерируется - если суть одинакова - сгенерируется одинаковый код:

  • Указатель может быть пустым - ссылка не может быть пустой.
  • при использовании new delete this более удобны переменные с использованием указателя (по ссылке можно - но гораздо сложнее выражения).
  • через указатель, можно использовать обьект, как массив (void f(int *ptr){ptr[0];}), через ссылку нет.
  • доступ к полям при указателе происходит посредством ->, а к полям ссылки через точку ..
  • от указателя можно перейти к ссылке используя унарный оператор * и от ссылки можно перейти к указателю используя унарный оператор &. (не унарные опрераторы выполняют математические или логические действия).
READ ALSO
Удаление папок Windows Kits

Удаление папок Windows Kits

Столкнулся с интересным вопросом, причем ничего явно отвечающего на него в интернете не нашелСобственно, есть папка Program Files (x86)\Windows Kits/10/Include...

136
Variadic templates C++

Variadic templates C++

есть следующий код:

133
С++ ссылка на временный объект

С++ ссылка на временный объект

Хочу разобраться в двух следующих вопросах:

156
Откуда взялось значение

Откуда взялось значение

Имеется программа, которая берет из файла значения, записывает их в вектор типа структуры и затем по этим значениям рисует фигуру: поля структуры...

127