内联函数 —— C 中关键字 inline 用法解析
一、什么是內聯函數
? ? ? ?在C語言中,如果一些函數被頻繁調用,不斷地有函數入棧,即函數棧,會造成棧空間或棧內存的大量消耗。
? ? ? ?為了解決這個問題,特別的引入了inline修飾符,表示為內聯函數。
? ? ? ?棧空間就是指放置程式的局部數據也就是函數內數據的內存空間,在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。
下面我們來看一個例子:
[cpp]?view plaincopy
? ? ?上面的例子就是標準的內聯函數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在內部的工作就是在每個for循環的內部任何調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧內存重復開辟所帶來的消耗。
? ? ?其實這種有點類似咱們前面學習的動態庫和靜態庫的問題,使 dbtest 函數中的代碼直接被放到main 函數中,執行for 循環時,會不斷調用這段代碼,而不是不斷地開辟一個函數棧。
二、內聯函數的編程風格
1、關鍵字inline 必須與函數定義體放在一起才能使函數成為內聯,僅將inline 放在函數聲明前面不起任何作用。
如下風格的函數Foo 不能成為內聯函數:
[cpp]?view plaincopy
而如下風格的函數Foo 則成為內聯函數:
[cpp]?view plaincopy
2、inline的使用是有所限制的
? ? ??inline只適合涵數體內代碼簡單的函數數使用,不能包含復雜的結構控制語句例如while、switch,并且內聯函數本身不能是直接遞歸函數(自己內部還調用自己的函數)。
三、慎用內聯
? ? ? ?內聯能提高函數的執行效率,為什么不把所有的函數都定義成內聯函數?如果所有的函數都是內聯函數,還用得著“內聯”這個關鍵字嗎?
? ? ???內聯是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收
獲會很少。另一方面,每一處內聯函數的調用都要復制代碼,將使程序的總代碼量增大,消耗更多的內存空間。
以下情況不宜使用內聯:
(1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。
(2)如果函數體內出現循環,那么執行函數體內代碼的時間要比函數調用的開銷大。
一個好的編譯器將會根據函數的定義體,自動地取消不值得的內聯(這進一步說明了inline 不應該出現在函數的聲明中)。
總結:
? ? ? ?因此,將內聯函數放在頭文件里實現是合適的,省卻你為每個文件實現一次的麻煩.而所以聲明跟定義要一致,其實是指,如果在每個文件里都實現一次該內聯函數的話,那么,最好保證每個定義都是一樣的,否則,將會引起未定義的行為,即是說,如果不是每個文件里的定義都一樣,那么,編譯器展開的是哪一個,那要看具體的編譯器而定.所以,最好將內聯函數定義放在頭文件中.?
總結
以上是生活随笔為你收集整理的内联函数 —— C 中关键字 inline 用法解析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CoffeeScript 1.9发布,引
- 下一篇: 常用的分析方法论及分析框架