通过反汇编回答对象类型的返回问题

当需要返回的值为局部变量的时候 :

  例如 : 

class test{
public :
    int a;
    double b;
    int arr[200];
};

// Type your code here, or load an example.
test square() {
    test t;
    return t;
}

int main (){
    test t = square();
    return 0;
}

  反汇编结果 :

square():
        push    rbp
        mov     rbp, rsp
        mov     QWORD PTR [rbp-8], rdi
        nop
        mov     rax, QWORD PTR [rbp-8]
        pop     rbp
        ret
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 816
        lea     rax, [rbp-816]
        mov     rdi, rax
        call    square()
        mov     eax, 0
        leave
        ret

  可以看到,如若是栈内存通过 rdi 将接受返回值的 那块内存的指针 传入到函数,然后直接修改那块内存。在这里也就是 rbp - 816 那块内存。

如若是堆内存,则只需要根据 eax 返回指针或者引用就可以了。

原文地址:https://www.cnblogs.com/vizdl/p/14287440.html