天天看點

c語言中的内聯函數,C語言中内聯函數inline的使用方法

該樓層疑似違規已被系統折疊 隐藏此樓檢視此樓

來源一:比特網 來源二:東方銳智

在C++中,為了解決一些頻繁調用的小涵數大量消耗棧空間或者是叫棧記憶體的問題,特别的引入了inline修飾符,表示為内聯涵數。

可能說到這裡,很多人還不明白什麼是棧空間,其實棧空間就是指放置程式的局部資料也就是函數内資料的記憶體空間,在系統下,棧空間是有限的,如果頻繁大量的使用就會造成因棧空間不足所造成的程式出錯的問題,涵數的死循環遞歸調用的最終結果就是導緻棧記憶體空間枯竭。

下面我們來看一個例子

C++ 代碼

#include

#include

using namespace std;

inline string dbtest(int a); //函數原形聲明為inline即:内聯涵數

void main()

{

for (int i=1;i<=10;i++)

{

cout 《 i 《 ":" 《 dbtest(i) 《 endl;

}

cin.get();

}

string dbtest(int a)//這裡不用再次inline,當然加上inline也是不會出錯的

{

return (a%2>0)?"奇":"偶";

}

上面的例子就是标準的内聯涵數的用法,使用inline修飾帶來的好處我們表面看不出來,其實在内部的工作就是在每個for循環的内部所有調用dbtest(i)的地方都換成了(i%2>0)?"奇":"偶"這樣就避免了頻繁調用函數對棧記憶體重複開辟所帶來的消耗。

說到這裡很多人可能會問,既然inline這麼好,還不如把所謂的函數都聲明成inline,嗯,這個問題是要注意的,inline的使用是有所限制的,inline隻适合涵數體内代碼簡單的涵數使用,不能包含複雜的結構控制語句例如while、switch,并且内聯函數本身不能直接調用遞歸函數(自己内部還調用自己的函數)。

說到這裡我們不得不說一下在c語言中廣泛被使用的#define語句,是的define的确也可以做到inline的這些工作,但是define是會産生副作用的,尤其是不同類型參數所導緻的錯誤,由此可見inline有更強的限制性和能夠讓編譯器檢查出更多錯誤的特性,在c++中是不推薦使用define的。