天天看點

内聯函數總結

目的:為了解決一些頻繁調用的小函數大量消耗棧空間或者是叫棧記憶體(棧空間就是指放置程式的局部資料也就是函數内資料的記憶體空間,頻繁大量的使用函數如死循環遞歸等會導緻枯竭)的問題,特别的引入了inline修飾符,表示為内聯涵數。

特點:

1.調用點内展開該函數

2.inline函數必須在調用該函數的每個文本檔案中定義

3.建議把inline函數的定義放到頭檔案中:這種方法保證每個inline函數隻有一個定義,無需指派代碼。

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

5.inline specifier僅僅是對編譯器的建議,編譯器有權利忽略這個建議。

    編譯器是如何決定函數内聯與否呢?

    一般情況下關鍵性因素包括函數體的大小,是否有局部對象被聲明,函數的複雜性等等。

6.自動優化内聯函數以及規範寫法

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){}

缺點:

根本:内聯是以代碼膨脹(複制)為代價,會使代碼量增大。如内部代碼執行開銷大于函數調用的占記憶體消耗開銷,則不建議使用。

1.如果函數體内的代碼比較長,使用内聯将導緻記憶體消耗代價較高。

2.如果函數體内出現循環,那麼執行函數體内代碼的時間要比函數調用的開銷大。

優點:

根本:内聯函數既能夠去除函數調用所帶來的效率負擔又能夠保留一般函數的優點。

1.内聯函數看起來和普通函數一樣,它可以有參數和傳回值,也可以有自己的作用域,然而它卻不會引入一般函數調用所帶來的負擔。另外, 它可以比宏更安全更容易調試。類的内聯函數也是函數,編繹器在調用一個内聯函數,首先會檢查參數問題,保證調用正确,像對待真正函數一樣,消除了隐患及局限性。

2.inline定義的内聯函數,函數代碼被放入符号表中,在使用時進行替換(像宏一樣展開),效率很高。

3.inline可以作為類的成員函數,可以使用所在類的保護成員及私有成員。

題外:

extern inline表示該函數是已聲明過的了.由于函數本身可以聲明多次,是以extern對函數的影響僅僅把函數的隐藏屬性顯式化了.

extern 對于非函數的對象是有用的,因為對象聲明時會帶來記憶體的配置設定,而用 extern就表示該對象已經聲明過了,不用再配置設定記憶體.

static是以前C的用法.目的是讓該關鍵字辨別的函數隻在本地檔案可見,同一個程式的其它檔案是不可見該函數的.換句話說,就算你其它檔案裡包含了同名同參數表的函數定義的話,也是不會引起函數重複定義的錯誤的.因為static是僅在目前檔案可見.

總結:

短小、結構簡單、經常調用的函數攜程内聯函數放在.h檔案中是能夠提高效率的手段。但切記結構複雜代碼冗長的函數寫成内聯函數。