如何在程序集中编译c ++ by-ref参数传递?

Anz*_*rio 4 c++ compiler-construction assembly

在大学的最后几年,我有一个关于编译器的课程.我们为C的子集创建了一个编译器.我一直想知道如何在C++中将pass-by-ref函数调用编译成汇编.

根据我的记忆,pass-by-val函数调用遵循以下过程:

  • 存储PP的地址
  • 将参数推入堆栈
  • 执行功能调用
  • 在函数中,从堆栈中弹出参数

传递参考有什么不同?(int void(int&);)

编辑:

我可能听起来完全失去了,但是,如果你能帮助我,我真的很感激.

每个人的答案基本上都是传递地址而不是值.我明白这基本上是指针传递的东西.那么,为什么这两个函数表现得不同呢?:

struct A {
    int x;
    A(int v){
        x = v;
    }
};

int byRef(A& v){
    v = A(3);
    return 0;
}

int byP   (A* v){
    v = &A(4); //OR new A(4)
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
    A a (1); A b (2);
    byRef(a); byP  (&b);
    cout << a.x << " " << b.x;

    system("pause");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我知道在byP(A*)中,v是按值传递的,因此,它不会影响调用者的参数.那么,你如何用A*实现byRef(A&)?

Ste*_*sop 6

您将指针传递给referand,就像您使用任何其他指针一样,并且被调用者知道如何使用它.因此,根据实现,它可能不在堆栈上 - 某些参数在某些调用约定中的寄存器中传递.

可能还有其他方法可以做到这一点,因为C++标准没有指定如何实现引用,即使它们是作为指针实现的,我想它们可能在调用约定中被区分.但是,指针是最明显的实现.