c++ inline函數


1.什么是內聯函數
在普通函數前加inline的就表示內聯函數

C++ 中的 inline 用法分類 編程技術
1、引入 inline 關鍵字的原因
在 c/c++ 中,為了解決一些頻繁調用的小函數大量消耗棧空間(棧內存)的問題,特別的引入了 inline 修飾符,
表示為內聯函數。
棧空間就是指放置程序的局部數據(也就是函數內數據)的內存空間。
在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程序出錯的問題,如,
函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。

實例:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 inline char* dbtest(int a) {
 5     return (i % 2 > 0) ? "" : "";
 6 } 
 7  
 8 int main()
 9 {
10    int i = 0;
11    for (i=1; i < 100; i++) {
12        printf("i:%d    奇偶性:%s /n", i, dbtest(i));    
13    }
14 }

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

2、inline使用限制
inline 的使用是有所限制的,inline 只適合涵數體內代碼簡單的涵數使用,
不能作為內聯函數的有:
2.1 遞歸函數
2.2 函數體內含有循環,switch語句的復雜結構的函數
2.3 代碼較多的函數

3、inline僅是一個對編譯器的建議
inline 函數僅僅是一個對編譯器的建議,所以最后能否真正內聯,看編譯器的意思,
它如果認為函數不復雜,能在調用點展開,
就會真正內聯,並不是說聲明了內聯就會內聯,聲明內聯只是一個建議而已。

4.建議
inline 函數的定義放在頭文件中
其次,因為內聯函數要在調用點展開,所以編譯器必須隨處可見內聯函數的定義,
要不然就成了非內聯函數的調用了。
所以,這要求每個調用了內聯函數的文件都出現了該內聯函數的定義。
因此,將內聯函數的定義放在頭文件里實現是合適的,省卻你為每個文件實現一次的麻煩。
聲明跟定義要一致:如果在每個文件里都實現一次該內聯函數的話,那么,
最好保證每個定義都是一樣的,否則,將會引起未定義的行為。如果不是每個文件里的定義都一樣,
那么,編譯器展開的是哪一個,那要看具體的編譯器而定。所以,最好將內聯函數定義放在頭文件中。

5.缺點
建議 inline 函數的定義放在頭文件中
其次,因為內聯函數要在調用點展開,所以編譯器必須隨處可見內聯函數的定義,要不然就成了非內聯函數的調用了。
所以,這要求每個調用了內聯函數的文件都出現了該內聯函數的定義。
因此,將內聯函數的定義放在頭文件里實現是合適的,省卻你為每個文件實現一次的麻煩。
聲明跟定義要一致:如果在每個文件里都實現一次該內聯函數的話,那么,
最好保證每個定義都是一樣的,否則,將會引起未定義的行為。如果不是每個文件里的定義都一樣
,那么,編譯器展開的是哪一個,那要看具體的編譯器而定。所以,最好將內聯函數定義放在頭文件中。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM