valor de retorno Vs referencia (en ensamblador)
Después de echar un vistazo a algunas preguntas (y respuestas) sobre este tema, probé el siguiente código simple en Compiler Explorer.
#include <iostream>
class TwoInts
{
public:
TwoInts() = default;
const int& getAByRef() const;
int getAByVal() const;
private:
int a;
int b;
};
const int& TwoInts::getAByRef() const
{
return a;
}
int TwoInts::getAByVal() const
{
return a;
}
int main()
{
TwoInts ti;
const int& num1 { ti.getAByRef() };
const int num2 { ti.getAByVal() };
//std::cout << num1 << ' ' << num2 << '\n';
}
Ahora veo diferentes códigos generados para las dos funciones miembro getAByRef
y getAByVal
:
TwoInts::getAByRef() const:
mov rax, rdi
ret
TwoInts::getAByVal() const:
mov eax, DWORD PTR [rdi]
ret
¿Puede alguien explicar qué hacen esas dos instrucciones de ensamblaje diferentes?
davy.ai
Las dos instrucciones de ensamblaje diferentes hacen lo siguiente:
TwoInts::getAByRef() const:
mueve el valor del puntero “this” (rdi
) al registro de retorno (rax
) y lo devuelve. Esto significa efectivamente que la función está devolviendo una referencia a la variable miembroa
.TwoInts::getAByVal() const:
carga el valor de la variable miembroa
en el registro de retorno (eax
) y lo devuelve. Esto significa que la función está devolviendo el valor de la variable miembroa
por valor.Entonces, en resumen, la primera función (
getAByRef
) devuelve una referencia a la variable miembroa
y la segunda función (getAByVal
) devuelve el valor de la variable miembroa
.