采纳答案成功!
向帮助你的同学说点啥吧!感谢那些助人为乐的人
jne Fib2+11h(0AA1520h)
这个地址 0AA1520h 是这样的
0AA1520h cmp ecx,1 0AA1523h je,Fib2+27h(0AA1536h)
尾递归调用的时候跳转到函数顶部,应该先判断是否等于0呀,怎么直接就判断是否等于1了?
这个是编译器对代码逻辑进行优化了,因为第一次进函数时,这个值如果是小于等于1的,那就不会走到尾调用这一步,否则初值必大于2,此时再进行尾调用时,这个值发生递减,当这个值等于1时就已经是递归出口了,它永远都不会走到判0的时候,所以也就没有必要判断是否等于0了。
同学,请问问题详细描述清你问题的上下文和C++源码,不要直接放一段汇编代码,谢谢
函数是 int Fib2(int n, int ret0,int ret1) { if(n == 0) { return ret0; } else if(n==1) { return ret1; } return Fib(n-1,ret1,ret0+ret1); } 当断点进入汇编以后 return Fib(n-1,ret1,ret0+ret1); 最后一句生成的汇编调用是: 0AA1525 lea eax,[edx+esi] 0AA1528 mov edx,esi 0AA152A mov esi,eax 0AA152C sub ecx,1 0AA152C jne Fib2+11h(0AA1520h) 跳转到这个地址 0AA1520h 是这样的 0AA1520h cmp ecx,1 0AA1523h je,Fib2+27h(0AA1536h) 尾递归调用的时候跳转到函数顶部,应该先判断是否等于0呀,怎么直接就判断是否等于1了? (视频中的汇编是这样的)
看👀到问题的补充了么
编译器生成的汇编有可能会优化部分不需要的代码。
登录后可查看更多问答,登录/注册
一部大片,一段历史,构建C++知识框架的同时重塑你的编程思维
1.3k 12
1.2k 12
1.3k 10
1.2k 9
1.0k 9