????: 在c/c++中,為了解決一些頻繁調用的小函數大量消耗??臻g或是叫棧內存的問題,特別的引入了inline修飾符,表示為內聯(lián)函數。??臻g就是指放置程式的局部數據也就是函數內數據的內存空間,在系統(tǒng)下,??臻g是有限的,假如頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,函數的死循環(huán)遞歸調用的最終結果就是導致棧內存空間枯竭。下面我們來看一個例子:#include <stdio.
在c/c++中,為了解決一些頻繁調用的小函數大量消耗??臻g或是叫棧內存的問題,特別的引入了inline修飾符,表示為內聯(lián)函數。
棧空間就是指放置程式的局部數據也就是函數內數據的內存空間,在系統(tǒng)下,??臻g是有限的,假如頻繁大量的使用就會造成因??臻g不足所造成的程式出錯的問題,函數的死循環(huán)遞歸調用的最終結果就是導致棧內存空間枯竭。
下面我們來看一個例子:
#include <stdio.h> //函數定義為inline即:內聯(lián)函數 inline char* dbtest(int a) { return (i % 2 > 0) ? "奇" : "偶"; } int main() { int i = 0; for (i=1; i < 100; i++) { printf("i:%d 奇偶性:%s /n", i, dbtest(i)); } }
在這種情況時當在下表調用函數時,會變成(i%2>0)?"奇":"偶";避免了函數的重復重復調用對棧內存重復開辟所帶來的消耗;
當然,inline函數不是在任何條件下都可以使用的,只有函數本身沒有調用本身并且函數不是復雜函數(當函數中存在while循環(huán)或swich語句時為復雜函數,但是不是復雜函數還要看編譯器對它的判斷)時,才可以使用;
補充:
inline函數僅僅是一個建議,對編譯器的建議,所以最后能否真正內聯(lián),看編譯器的意思,它如果認為函數不復雜,能在調用點展開,就會真正內聯(lián),并不是說聲明了內聯(lián)就會內聯(lián),聲明內聯(lián)只是一個建議而已.
其次,因為內聯(lián)函數要在調用點展開,所以編譯器必須隨處可見內聯(lián)函數的定義,要不然,就成了非內聯(lián)函數的調用了.所以,這要求每個調用了內聯(lián)函數的文件都出現(xiàn)了該內聯(lián)函數的定義。
因此,將內聯(lián)函數放在頭文件里實現(xiàn)是合適的,省卻你為每個文件實現(xiàn)一次的麻煩.而所以聲明跟定義要一致,其實是指,如果在每個文件里都實現(xiàn)一次該內聯(lián)函數的話,那么,最好保證每個定義都是一樣的,否則,將會引起未定義的行為,即是說,如果不是每個文件里的定義都一樣,那么,編譯器展開的是哪一個,那要看具體的編譯器而定.所以,最好將內聯(lián)函數定義放在頭文件中.
而類中的成員函數缺省都是內聯(lián)的,如果在類定義時就在類內給出函數,那當然最好.如果在類中未給出成員函數定義,而又想內聯(lián)該函數的話,那在類外要加上inline,否則就認為不是內聯(lián)的.
為了方便,將內聯(lián)函數直接聲明時就定義,放在頭文件中.這樣其它文件包含了該頭文件,就在每個文件都出現(xiàn)了內聯(lián)函數的定義.就可以內聯(lián)了.