內聯函式:在c++中,以inline修飾的函式叫做內聯函式,編譯時c++編譯器會呼叫內聯函式的地方展開,沒有函式壓棧開銷,內聯函式提公升程式執行的效率。
基本思想:將每個函式呼叫以它的**體來替換。
內聯函式在 c++ 中的地位是用來替換 c 中的巨集**塊
內聯函式的注意事項:
(1)內聯函式是以空間換時間的做法,省去呼叫函式的額外開銷。所以**很長或者有迴圈/遞迴的函式不適宜使用內聯。
(2)inline對編譯器而言只是乙個建議,如果定義的函式體內有遞迴/迴圈等,編譯器優化時會自動忽略掉內聯。
(3)inline必須與函式定義放在一起,才能成為內聯函式,僅將內聯放在宣告前是不起作用的。
(4)一般情況下,內聯函式只會用在函式內容非常簡單的情況,如果內聯函式**過多會造成可讀性差等問題。
內聯函式的宣告:
(1)內聯函式可以在一開始僅宣告一次。
(2)內聯函式必須在呼叫之前被宣告或定義,因為內聯函式的**必須在替換之前已經生成被替換的**。
(3)在實現的時候可以不用加inline。
遞迴函式不能被宣告為內聯函式
內聯函式的優點:
(1)沒有開棧、清棧操作;
(2)不生成符號;
(3)呼叫點把**直接展開;
(4)相對於巨集來說,內聯有**,節省記憶體的同時可以除錯。
內聯函式的缺點:
(1)以**膨脹為代價;
(2)造成程式執行過慢;
(3)想對程式庫中的內聯函式進行二進位制**公升級是不可能的。
內聯函式的特徵:
1、內聯函式具有普通函式的特徵(引數檢查,返回型別等);
(1)型別更加安全;
(2)c++ 提供各種方式讓大家摒棄 c 中不好的一些特性,內聯函式就是其中之一;
2,函式的內聯請求可能被編譯器拒絕;
(1)可以通過配置的方式讓編譯器支援內聯函式的請求;
3、函式被內聯編譯後,函式體直接擴充套件到呼叫的地方;
(1)如果內聯成功,其效率上可以和巨集**塊媲美,且其在型別上比巨集**塊安全很多,因此在 c++ 程式設計中,首選內聯函式;
(2)巨集**片段由預處理器處理,進行簡單的文字替換,沒有任何編譯過程,因此可能出現***;
內聯函式和巨集定義:
(1)巨集定義可以替換小函式,但是有缺陷。
(2)巨集定義告訴編譯器簡單的替換**,不檢查引數型別。
(3)如果涉及到運算的時候巨集定義不能代表程式設計師的意圖。
(4)巨集定義的作用往往可以用內聯函式替代,並且相比具有了檢查函式的作用。
為什麼inline能夠很好的取代預定義?
(1)inline定義的內聯函式,函式的**在使用時直接被替換,沒有呼叫開銷,提公升了效率。
(2)類的內聯函式也是函式,編譯器在呼叫時會檢查它的引數,消除隱患
(3)定義在類內的成員函式預設定義為內聯函式。可以使用所在類的保護成員和私有成員。
內聯函式和普通函式的區別:
內聯函式和普通函式最大的區別在於內部的實現方面,當普通函式在被呼叫時,系統首先跳躍到該函式的入口位址,執行函式體,執行完成後,再返回到函式呼叫的地方,函式始終只有乙個拷貝; 而內聯函式則不需要進行乙個定址的過程,當執行到內聯函式時,此函式展開(很類似巨集的使用),如果在 n處呼叫了此內聯函式,則此函式就會有n個**段的拷貝。
內聯函式示例:
#includeusing namespace std;
inline int max(int,int);
int main()
關鍵字inline將函式max說明成內聯函式。其使用方式和一般函式一樣,只不過在程式執行時並不產生實際函式呼叫,而是在函式呼叫處將函式**展開執行。 C 內聯函式
1 什麼是內聯函式?內聯函式就是小型函式,犧牲空間來節省函式呼叫的開銷,一般用作比較小的函式,即函式內部沒有迴圈 開關語句等。內聯函式被發明出來就是為了取代c中的巨集,因為巨集是單純的替換而沒有型別檢查所以經常出毛病,2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率...
C 內聯函式
1 什麼是內聯函式?2 為什麼要引入內聯函式?3 為什麼inline能取代巨集?4 內聯函式和巨集的區別?5 什麼時候用內聯函式?6 如何使用內聯函式?7 內聯函式的優缺點?8 如何禁止函式進行內聯?9 注意事項 1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內...
c 內聯函式
1 什麼是內聯函式?內聯函式是指那些定義在類體內的成員函式,即該函式的函式體放在類體內。2 為什麼要引入內聯函式?當然,引入內聯函式的主要目的是 解決程式中函式呼叫的效率問題。另外,前面我們講到了巨集,裡面有這麼乙個例子 define abs x x 0?x x 當 i出現時,巨集就會歪曲我們的意思...