什么"兄弟呼叫"意思?

时间:2014-02-26 09:37:35

标签: c++ gcc compiler-optimization tail-recursion

在GCC手册上,

  

-foptimize同胞通话

     
    

优化兄弟和尾部递归调用。

  

我知道尾递归调用,例如

  

int sum(int n){return n == 1? 1:n + sum(n-1); }

然而,兄弟姐妹的意思是什么意思?

3 个答案:

答案 0 :(得分:5)

  

编译器   如果两个函数共享相同,则认为它们是兄弟姐妹   返回类型的结构等价,以及匹配空间   他们的论点要求。

http://www.drdobbs.com/tackling-c-tail-calls/184401756

答案 1 :(得分:4)

必须是这样的:

int ispair(int n) { return n == 0 ? 1 : isodd(n-1); }
int isodd(int n) { return n == 0 ? 0 : ispair(n-1); }

通常,如果函数调用是最后一个句子,那么它可以被跳转替换。

void x() { ......; y(); }

在这种情况下,y()可以用跳转(或内联函数)代替,而不是使用标准函数调用。

答案 2 :(得分:2)

尾巴呼叫

如果函数调用是在另一个函数中执行的最后一个动作,则称它为尾部调用。

该名称源于该函数调用出现在其他函数的尾部位置的事实。

int foo(int a, int b) {
    // some code ...
    return bar(b);    // Tail call which is neither sibling call nor tail recursive call.
}

bar出现在foo的尾部位置。呼叫bar是尾声。


尾部递归调用

尾部递归调用是尾部调用的一种特殊情况,其中被叫方功能与调用方功能相同。

int foo(int a, int b) {
    if (a > 0) {
        return foo(a - 1, b + 1);    // Tail recursive call
    } else {
        return b;
    }
}

同级通话

同级调用是尾部调用的另一种特殊情况,其中调用者函数和被调用者函数不必相同,但是它们具有兼容的堆栈占用空间。

这意味着两个函数的返回类型必须相同,并且所传递的参数必须占用相同的堆栈空间。

int foo(int a, int b) {
    // some code ...
    return bar(a - 1, b);    // Sibling call, also a tail call, but not a tail recursive call.
}

每个尾部递归调用都是同级调用,因为定义暗示每个函数都是自身的同级。


为什么要区分?

由于相同的堆栈占用空间,更换堆栈框架变得相对容易。 编译器编写人员不必调整堆栈框架的大小,并且就位更改变得简单明了。