C++ 什么是;“兄弟姐妹呼叫”;什么意思?

C++ 什么是;“兄弟姐妹呼叫”;什么意思?,c++,gcc,compiler-optimization,tail-recursion,C++,Gcc,Compiler Optimization,Tail Recursion,在GCC手册上 -优化同级呼叫 优化同级和尾部递归调用 例如,我知道尾部递归调用 int-sum(int-n){返回n==1?1:n+sum(n-1);} 然而,兄弟姐妹呼叫是什么意思?它必须是这样的: int ispair(int n) { return n == 0 ? 1 : isodd(n-1); } int isodd(int n) { return n == 0 ? 0 : ispair(n-1); } 通常,如果函数调用是最后一句话,则可以用跳转替换 void x() { ...

在GCC手册上

-优化同级呼叫

优化同级和尾部递归调用

例如,我知道尾部递归调用

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


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

它必须是这样的:

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()
可以替换为跳转(或内联函数),而不是使用标准函数调用

编译程序 如果两个函数共享同一个函数,则将它们视为兄弟函数 返回类型的结构等价性,以及匹配空间 他们论点的要求

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

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

int foo(int a, int b) {
    // some code ...
    return bar(b);    // Tail call which is neither sibling call nor tail recursive call.
}
int foo(int a, int b) {
    if (a > 0) {
        return foo(a - 1, b + 1);    // Tail recursive call
    } else {
        return b;
    }
}
bar
出现在
foo
的尾部位置。对
bar
的调用是尾部调用


尾部递归调用 尾部递归调用是尾部调用的一种特殊情况,其中被调用方函数与调用方函数相同

int foo(int a, int b) {
    // some code ...
    return bar(b);    // Tail call which is neither sibling call nor tail recursive call.
}
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.
}
每个尾部递归调用都是同级调用,因为定义意味着每个函数都是自己的同级


为什么要区分? 由于相同的堆栈占用空间,替换堆栈框架变得相对容易。
编译器编写者不必调整堆栈帧的大小,就地变异变得简单。

这不是尾部递归。显然在实践中有一些信息,GCC是“tail”的同义词(他们在内部文档中将其称为a.k.a.tail)。形式上,某些函数具有相同大小的返回类型和相同总字数的参数列表。因此,例如
int-foo(char,char)
int-bar(short)
将是同级的,并且可以进行尾部优化(因此
foo
调用
bar
哪个调用
foo
原则上会起作用)。@AngewisnolongerproudofSO这个问题是谷歌第一个“同级调用函数含义”的问题所以它也应该有一些信息。这和尾部调用优化有什么不同?