Страницы

Поиск по вопросам

пятница, 13 декабря 2019 г.

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

#cpp #указатели #ссылки


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


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


Ответы

Ответ 1



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

Ответ 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];}), через ссылку нет. доступ к полям при указателе происходит посредством ->, а к полям ссылки через точку .. от указателя можно перейти к ссылке используя унарный оператор * и от ссылки можно перейти к указателю используя унарный оператор &. (не унарные опрераторы выполняют математические или логические действия).

Комментариев нет:

Отправить комментарий