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