91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

inline方法怎么在C++中使用

發布時間:2021-01-18 16:37:21 來源:億速云 閱讀:143 作者:Leah 欄目:編程語言

本篇文章為大家展示了inline方法怎么在C++中使用,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

1. 引入inline關鍵字的原因

在c/c++中,為了解決一些頻繁調用的小函數大量消耗棧空間(棧內存)的問題,特別的引入了inline修飾符,表示為內聯函數。

棧空間就是指放置程序的局部數據(也就是函數內數據)的內存空間。

在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程序出錯的問題,如,函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。

下面我們來看一個例子:

#include <stdio.h>
//函數定義為inline即:內聯函數
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));  
  }
}

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

2. inline使用限制

inline的使用是有所限制的,inline只適合涵數體內代碼簡單的涵數使用,不能包含復雜的結構控制語句例如while、switch,并且不能內聯函數本身不能是直接遞歸函數(即,自己內部還調用自己的函數)。

3. inline僅是一個對編譯器的建議

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

4. 建議:inline函數的定義放在頭文件中

其次,因為內聯函數要在調用點展開,所以編譯器必須隨處可見內聯函數的定義,要不然就成了非內聯函數的調用了。所以,這要求每個調用了內聯函數的文件都出現了該內聯函數的定義。

因此,將內聯函數的定義放在頭文件里實現是合適的,省卻你為每個文件實現一次的麻煩。

聲明跟定義要一致:如果在每個文件里都實現一次該內聯函數的話,那么,最好保證每個定義都是一樣的,否則,將會引起未定義的行為。如果不是每個文件里的定義都一樣,那么,編譯器展開的是哪一個,那要看具體的編譯器而定。所以,最好將內聯函數定義放在頭文件中。

5. 類中的成員函數與inline

定義在類中的成員函數缺省都是內聯的,如果在類定義時就在類內給出函數定義,那當然最好。如果在類中未給出成員函數定義,而又想內聯該函數的話,那在類外要加上inline,否則就認為不是內聯的。

例如,

class A
{
  public:void Foo(int x, int y) { } // 自動地成為內聯函數
}

將成員函數的定義體放在類聲明之中雖然能帶來書寫上的方便,但不是一種良好的編程風格,上例應該改成:

// 頭文件
class A
{
  public:
  void Foo(int x, int y);
}
// 定義文件
inline void A::Foo(int x, int y){}

6. inline 是一種“用于實現的關鍵字”

關鍵字inline 必須與函數定義體放在一起才能使函數成為內聯,僅將inline 放在函數聲明前面不起任何作用。

如下風格的函數Foo 不能成為內聯函數:

inline void Foo(int x, int y); // inline 僅與函數聲明放在一起
void Foo(int x, int y){}

而如下風格的函數Foo 則成為內聯函數:

void Foo(int x, int y);
inline void Foo(int x, int y) {} // inline 與函數定義體放在一起

所以說,inline 是一種“用于實現的關鍵字”,而不是一種“用于聲明的關鍵字”。一般地,用戶可以閱讀函數的聲明,但是看不到函數的定義。盡管在大多數教科書中內聯函數的聲明、定義體前面都加了inline 關鍵字,但我認為inline不應該出現在函數的聲明中。這個細節雖然不會影響函數的功能,但是體現了高質量C++/C 程序設計風格的一個基本原則:聲明與定義不可混為一談,用戶沒有必要、也不應該知道函數是否需要內聯。

7. 慎用inline

內聯能提高函數的執行效率,為什么不把所有的函數都定義成內聯函數?如果所有的函數都是內聯函數,還用得著“內聯”這個關鍵字嗎?

內聯是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。

如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。另一方面,每一處內聯函數的調用都要復制代碼,將使程序的總代碼量增大,消耗更多的內存空間。

以下情況不宜使用內聯:

(1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。

(2)如果函數體內出現循環,那么執行函數體內代碼的時間要比函數調用的開銷大。類的構造函數和析構函數容易讓人誤解成使用內聯更有效。要當心構造函數和析構函數可能會隱藏一些行為,如“偷偷地”執行了基類或成員對象的構造函數和析構函數。所以不要隨便地將構造函數和析構函數的定義體放在類聲明中。一個好的編譯器將會根據函數的定義體,自動地取消不值得的內聯(這進一步說明了 inline 不應該出現在函數的聲明中)。

上述內容就是inline方法怎么在C++中使用,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

孝感市| 海南省| 湘潭市| 剑河县| 抚顺县| 监利县| 鄂托克前旗| 临夏市| 崇信县| 重庆市| 南靖县| 奎屯市| 浦城县| 辽中县| 江孜县| 通许县| 晋州市| 梧州市| 长海县| 河源市| 宽甸| 菏泽市| 阿合奇县| 普陀区| 怀集县| 姚安县| 博乐市| 沁水县| 宁海县| 太湖县| 惠东县| 南阳市| 依安县| 康保县| 红原县| 武汉市| 麻阳| 博罗县| 潞城市| 江达县| 洞头县|