C++中宏与内联函数
1宏定義
C++是C的超集,C++繼承了C的一個重要特性就是效率,在C中提高程序運行效率的重要手段就是宏,宏可以不用普通函數的調用但使用起來就像普通函數調用一樣,宏的實現采用的是預處理器而不是編譯器,所以就沒有了參數調用、生成匯編語言的CALL,返回參數和執行匯編語言RETURN等時間的花費,因而大大提高了程序執行的效率。當然在C++中也可以采用這種方式提高程序執行的效率。
例如:
#include<iostream.h>
#define doub(x) x*2
int main()
{
for(int i=1;i<=3; i++)
cout<<i<<"doubled is "<<doub(i)<<endl;
cout<<"1+2doubled is "<<doub(1+2)<<endl;
return 0;
}
程序運行的結果為:
1 doubled 2
2 doubled 4
3 doubled 6
1+2 doubled 5
當程序運行到cout<<i<<"doubled is "<<doub(i)<<endl;和cout<<"1+2doubled is "<<doub(1+2)<<endl;時,直接將宏定義的代碼在程序中直接展開,這樣就省去了函數調用的開銷,大大提高了程序執行的效率。
2內聯函數
在C++中,函數說明之前,冠以關鍵字"inline",該函數就被聲明為內聯函數。它和宏定義有著相同的作用和相似的機理,在內聯函數被調用時,C++的編譯器使用函數體中的代碼替代函數調用表達式,這樣就較少的函數調用的開銷,加快的了程序的執行。
例如:
#include<iostream.h>
inline float circle(float r)
{return 3.1416rr;}
int main(){
for(int i=1;i<=3;i++)
cout<<"r=“<<i<<” area="<<circle(i)<<endl;
return 0;
}
程序運行的結果為:
r=1 area=3.1416
r=2 area=12.5664
r=3 area=28.2744
當程序運行到cout<<"r=“<<i<<” area="<<circle(i)<<endl;時直接將定義的內聯函數在程序展開,減少了普通函數調用的開銷,提高了程序執行的效率,這一點和宏定義非常相似,但是兩者又不完全相同,而且有著非常重要的區別。
3兩者之間的區別
對于上面的第二道例題采用內聯函數和宏定義,所得的程序運行的結果應該是相同的,那么它們之間的區別在哪里呢?我們再來研究一下上面的第一道例題。雖然宏定義在外觀和行為上與函數調用一樣,但是當微妙的差異出現時,問題就出現了。例如對于第一道例題,該程序所定義的宏是完成乘2的功能,那么分析程序運行的結果,可以看出前三個結果是正確的,但是第四個結果與期望的值由區別,我們期望的結果應該是6,而實際運行的結果卻是5,問題的原因是編譯程序將輸出語句cout<<"1+2doubled is "<<doub(1+2)<<endl;解釋為cout<<"1+2doubled is "<<1+2*2<<endl;,它改變了原先我們所期望的運算符的優先級的次序,所以所得的結果也不是我們事先所期望的,程序執行的結果為5。由這個例子可以看出宏定義本身存在著一定的不安全性,有時會隱藏難以發現的錯誤。相反,如果這個例子采用內聯函數來完成的話,實驗證明,程序運行的結果為:
1 doubled 2
2 doubled 4
3 doubled 6
1+2 doubled 6
通過這個例子,我們可以看出內聯函數和宏定義之間的區別,內聯函數消除了宏定義存在著的潛在的不安全
性,因此,大多數程序員在編寫程序的時候,很少采用宏定義。
4結論
下面我們研究一下造成這種區別的根本原因,宏定義的實現是通過預處理器,而內聯函數的實現是通過編譯器,正是這樣的差別造成了以上程序運行結果的不同。宏定義存在的關鍵問題是我們可能認為預處理器的行為和編譯器的行為一樣,因此在使用過程中容易被混淆。
最后,學習從來不是一個人的事情,要有個相互監督的伙伴,對于C/C++感興趣可以搜素千人群:C/C++學習編程13群(jack建立)有興趣交流或者了解一下的可以進來交流,另外進群就可以領取相關的學習資料哦
【參考文獻】
[1]王菊英. 當前我國利率走勢探究[J]. 經濟師 , 2003,(05)
[2]劉繁榮.建設學習型企業之管見[J]現代管理科學 , 2004,(04)
[3] 任美姣. 淺談合作探究教學模式[J]. 浙江工商職業技術學院學報 , 2003,(02)
[4]齊善鴻. 分合的邏輯與趨勢–對企業兩權分合的研究與思考[J]. 理論與現代化 , 1999,(01)
[5]楊則正. Symantec公司的C++8.0編譯器[J]. 管理科學文摘 , 1998,(11)
[6]楊凡. 淺析C++中內聯函數與宏的區別[J]. 科技咨詢導報 , 2007,(01)
[7]鄭冉冉. 企業營銷道德問題探究[J]. 江蘇商論 , 2005,(07)
[8]付昱綱. 網絡名人:C++之父――Stroustrup[J]. 教育與職業 , 2003,(18)
[9]楊勇. 我國獨立董事職業化道路的探究[J]. 經濟前沿 , 2005,(06)
[10]陳永強. 《電子商務概論》課程大綱探究[J]. 杭州師范學院學報(醫學版) , 2005,
[11]]《c + + 語言和面向對象程序設計教程》 陳維興 林小茶 編著 清華大學出版社 2000. 1
總結
以上是生活随笔為你收集整理的C++中宏与内联函数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: IT部门每天忙到飞起,年终总结价值却不能
- 下一篇: 电商行业最复杂的人货场分析,我用一个案例