亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

遞歸函數若是內聯(inline)函數,是否就不需要函數調用時的大開銷了?

遞歸函數若是內聯(inline)函數,是否就不需要函數調用時的大開銷了?

慕斯王 2019-02-26 07:03:52
遞歸函數若是內聯(inline)函數,是否就不需要函數調用時的大開銷了?
查看完整描述

3 回答

?
ibeautiful

TA貢獻1993條經驗 獲得超6個贊

遞歸是內聯的話,編譯器如何編譯?
遞歸的處理方法是講函數調用層層入棧,通過出棧來調用每層的函數;
如果寫成內聯,編譯器編譯時都搞不清楚了吧,更別談調用了。

查看完整回答
反對 回復 2019-03-26
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

#include <stdio.h>
inline int fact(int n)
{
if(n<=1)
{
return 1;
}
else
{
return n*fact(n-1);
}
}

int main()
{
int n;

printf("Input n:");
scanf("%d",&n);
printf("n!=%d\n",fact(n));
return 0;
}
上面,我把計算階乘的fact函數,聲明為內聯函數了,照樣能正常編譯,正常運行,結果也正確

我們知道,內聯函數,在編譯的時候,就對它進行了展開
這樣做的后果是:
提供程序執行的速度,因為不需要調用函數所進行的堆棧操作了
但它會增加代碼的長度,因此,當函數很長的時候,不建議使用內聯的方式

但考慮到遞歸函數,編譯器不可能無限展開的,而上面的例子又是可以的
所以,我猜想:
這種遞歸的情況下,即使聲明成內聯的,編譯也不報錯,
但實際上,仍然不是按內聯的方式進行處理

對比了一下內聯和不內聯兩種情況下的obj和exe文件,發現他們的大小都是一樣的:
aaa.obj 3,414 字節
aaa.exe 163,926 字節
也許這就證明了我的猜想吧

補充:
c語言當然不支持內聯啊,c++才有這個概念。
我之所以編譯沒有錯,說明我用的是c++的編譯器嘛
其實,我用的是VC++6.0,哈哈



查看完整回答
反對 回復 2019-03-26
?
撒科打諢

TA貢獻1934條經驗 獲得超2個贊

內聯函數不是總能申請成功的 ,她也需要較大的開銷,只是它存儲于緩存中,少了一些去外存調用函數的時間,當函數調用次數不多時,幾乎沒有優勢。

查看完整回答
反對 回復 2019-03-26
  • 3 回答
  • 0 關注
  • 2281 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號