目錄
在c語言中,我們使用了巨集函式,這是編譯器用來減少執行時間的一種優化技術。那麼問題來了,在c++中,有什麼更好的方法來解決這個問題呢?我們引入了內聯函式,這是編譯器用來減少執行時間的一種優化技術。我們將討論內聯函式的 「what, why, when & how」。
內聯函式是c++的乙個增強功能,可以減少程式的執行時間。函式可以通過指示編譯器,使其成為內聯函式,這樣編譯器就可以取代那些被呼叫的函式定義。編譯器會在編譯時替換內聯函式的定義,而不是在執行時引用函式定義。
注意:這只是建議編譯器將函式內聯,如果函式很大(在可執行指令等方面),編譯器可以忽略 "內聯 "請求,將函式作為普通函式處理。
要使任何函式成為內聯函式,在其定義的開頭使用關鍵字 "inline"。
例子:第一種情況:
class a
};
第二種情況:
class a ;
inline int a::add(int a, int b)
第三種情況:
inline int add_two (int a, int b)
你可以在它的類定義中定義乙個成員函式,或者如果你已經在類定義中宣告了(但沒有定義)該成員函式,你可以在外面定義它。
第一種情況:
當在類成員列表中定義的成員函式預設為內聯成員函式,所以第乙個class a定義裡,也可以省略inline關鍵字。
一般含有幾行**的成員函式通常被內聯宣告,或者說可以在類的定義中定義較短的函式。
第二種情況:
如果你在類定義之外定義乙個成員函式,它必須出現在包圍類定義的命名空間範圍內。你還必須使用範圍解析(::)操作符來限定成員函式的名稱。
這時如果要宣告為內聯函式,可以類中用inline關鍵字宣告它(並在其類之外定義該函式),或者在類的宣告之外用inline關鍵字定義它。
上面第二個class a是在定義處使用inline關鍵字。
第三種情況:
普通的全域性函式,可以在宣告或定義處新增inline關鍵字。
在下面的例子中,成員函式y::f()是乙個內聯成員函式:
鏈結屬性:
內聯修飾符不影響成員或非成員函式的鏈結屬性:鏈結預設為外部鏈結。
內部鏈程式設計客棧接表示只在當前檔案內可訪問,外部鏈結表示多個檔案可訪問。
區域性類的成員函式必須在其類定義中定義。因此,區域性類的成員函式是隱含的內聯函式。這些內聯成員函式沒有鏈結屬性。
在許多地方,我們為小的工作/功能建立函式,其中包含簡單和較少數量的可執行指令。想象一下它們每次被呼叫者呼叫時的開銷。
當遇到正常的函式呼叫指令時,程式會儲存緊隨函式呼叫語句之後的指令的記憶體位址,將被呼叫的函式載入到內www.cppcns.com存中,複製引數值,跳轉到被呼叫函式的記憶體位置,執行函式**,儲存函式的返回值,然後跳回執行被呼叫函式前剛剛儲存的指令位址。執行時間開銷太大。
c++的內聯函式提供了乙個替代方案。使用inline關鍵字,編譯器用函式**本身替換函式呼叫語句,然後編譯整個**www.cppcns.com(此過程成為**展開)。因此,使用內聯函式,編譯器不必跳到另乙個位置來執行函式,然後再跳回來,因為被呼叫函式的**已經提供給呼叫程式。
通過下面的優點、缺點和效能分析,你將能夠理解為什麼使用「inline」關鍵字。
1. 它避免了函式呼叫的開銷,從而加快了程式執行。
2. 當函式呼叫發生時,它節省了在堆疊上push/pop變數的開銷。
3. 它節省了從乙個函式中返**用處的開銷。
4. 它通過利用指令快取來更多使用本地引用。
5. 通過將其標記為內聯,你可以將函式定義放在標頭檔案中(也就是說,它可以包含在多個編譯單元中,而不會被鏈結器抱怨)。
1. 由於**展開,增加了最終可執行檔案的大小。
2. c++的內聯是在編譯時處理的。這意味著如果你改變了內聯函式的**,你將需要重新編譯所有使用它的**,以確保它被更新。
3.當在標頭檔案中使用時,它使你的標頭檔案變得更大,因為使用者並不關心這些資訊。
4.如上所述,它增加了可執行檔案的大小,這可能會導致記憶體的抖動。更多的頁面故障會降低你的程式效能。
5. 有時並不實用,例如在嵌入式系統中,由於儲存空間的限制,要保證盡可能小的可執行檔案。
1. 內聯函式只是乙個建議,而不是強制性的。編譯器可能會也可能不會內聯你標記為內聯的函式。沒有標記為內聯的函式,在編譯或連線時,也可能被設定為內聯。
2. 內聯的工作方式就像編譯器控制的複製/貼上,這與預處理器的巨集完全不同。巨集會被強行內聯,會汙染所有的命名空間和**,不容易除錯。
3. 所有在類中宣告並定義的成員函式預設是內聯的。所以不需要明確定義為內聯。
4. 虛函式不支援內聯。但是,有時候,當編譯器可以確定物件的型別時(即物件是在同乙個函式體中宣告和構造的),即使是乙個虛函式也會被內聯,因為編譯器確切地知道物件的型別。
5. 模板方法/函式並不總是被內聯的(它們在標頭檔案中的存在不會使它們自動內聯)。
6. 大多數編譯器會對遞迴函式進行內聯,有些編譯器有此功能的開關,並可以設定最大的遞迴深度。
c 內聯成員函式
內聯成員函式 類中的成員函式分為一般成員函式和內聯成員函式。把成員函式的 放入類宣告中,這種方式定義的類成員函式就叫內聯成員函式 隱式定義 程式使用內聯成員函式的方式與一般的成員函式的呼叫方式一樣。內聯函式和外聯函式之間的區別在於 定義乙個內聯函式時,編譯器會把內聯函式的 替換到程式中 這樣 效率要...
c ,內聯成員函式
內聯成員函式 有兩程方式實現內聯成員函式 1 在聲名成員函式的同時定義成員函式體 2 宣告成員函式時,在最前面加上inline關鍵字 在定義成員函式時也在最前面加上inline關鍵字 建議inline函式在標頭檔案中宣告,以便被不同檔案使用。同c 注意 內聯函式中如果出現條件或迴圈語句,則不會被真正...
內聯成員函式
把成員函式的 放如類定義中。這種方式定義的函式就叫內聯成員函式。程式使用內聯成員函式的方式可以與類外部定義的成員函式的使用方式完全相同。但是,內聯函式和外聯函式之間還是有一點區別的 定義乙個內聯函式時,編譯器會把內聯函式的 替換到程式中。使用非內聯函式時,就不會這樣做。但是我們不能讓所有的函式都內聯...