什么是sibling and tail recursive calls
阅读数:133 评论数:0
跳转到新版页面分类
C/C++
正文
1、tail call
在函数f中调用函数b,如果这个调用是函数f中执行的最后一条指令,那么这个调用就称为tail call。
int foo(float a, float b)
{
...
return bar(a/2)
}
//不是tail call的例子:
int foo(float a, float b)
{
....
c = bar(a/2)
}
//这里最后一条指令是对c进行赋值,而不是调用bar函数。
2、tail recursive call
如果一个tail call中,函数f和函数b是同一个函数,那么这个call就是tail recursive call。
3、proper tail call
在tail call基础上限制条件:
f调用b时,如果函数f的栈可以释放的话,这是一个proper tail call。
4、sibling call
首先这应该是一个proper tail call。
然后还有限制条件:
第一,b的参数所占用的空间不能比f占的空间大。
第二,f和b的返回类型是一样的。
5、汇编指令call和jump
jump指令只是修改了IP,然后直接跳转到该条指令执行,它是不管栈的。
call指令会先将当前的IP入栈,然后修改IP,然后跳转,执行完之后再IP出栈,跳转回来。
相关推荐
编译器中的sanitize来自于google的开源sanitizers项目,后GNU将该工具加入到GCC编译中,是查找隐藏Bug的利器。
-fsanitize=address</p
prolog和epilog其实就是两段固定的代码,当编译器对程序进行编译的时候就会生成两段代码,然后编译器会在每一个函数的开头塞入prolog代码,在每个函数的结尾塞入epilog代码。
一、linux kernel与常规C项目的区别
1、Linux内核是一个非常大的项目,所以需要我们有选择的进行代码索引。
2、Linux内核是架构相关,但是我们一般只关注于某一个选定架构,所以不需要索