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.Например 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];}
), через ссылку нет.->
, а к полям ссылки через точку .
.*
и от ссылки можно перейти к указателю используя унарный оператор &
. (не унарные опрераторы выполняют математические или логические действия).Виртуальный выделенный сервер (VDS) становится отличным выбором
Столкнулся с интересным вопросом, причем ничего явно отвечающего на него в интернете не нашелСобственно, есть папка Program Files (x86)\Windows Kits/10/Include...
Имеется программа, которая берет из файла значения, записывает их в вектор типа структуры и затем по этим значениям рисует фигуру: поля структуры...