C++ 什么是;“兄弟姐妹呼叫”;什么意思?
在GCC手册上 -优化同级呼叫 优化同级和尾部递归调用 例如,我知道尾部递归调用 int-sum(int-n){返回n==1?1:n+sum(n-1);}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() { ...
然而,兄弟姐妹呼叫是什么意思?它必须是这样的:
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这个问题是谷歌第一个“同级调用函数含义”的问题所以它也应该有一些信息。这和尾部调用优化有什么不同?