es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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?

Tags:  , , , ,

Answer

  1. Avatar for 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 miembro a.
    • TwoInts::getAByVal() const: carga el valor de la variable miembro a en el registro de retorno (eax) y lo devuelve. Esto significa que la función está devolviendo el valor de la variable miembro a por valor.

    Entonces, en resumen, la primera función (getAByRef) devuelve una referencia a la variable miembro a y la segunda función (getAByVal) devuelve el valor de la variable miembro a.

Comments are closed.