1、定義:在類聲明的內部聲明或定義的成員函數叫做內聯(inline)函數。——**我認為這個說法不全面。 內嵌函式是用在函數的聲明或實現前加"Inline"標識來表明該函數在編譯的時候可以按內嵌函式處理。但究竟是否真的按內嵌函式處理,取決於編譯器的處理。因為並不是所有的情況都適合採用內聯。 2、樣本: 1.在類聲明的內部聲明,而在類聲明外部定義叫做顯式內嵌函式 class display { int t; public: void output(void) } display object; inline void display::output(void) { cout << "i is " << i <<"\n"; } 2.在類聲明的內部定義,叫做隱式內嵌函式,如: class display { int t; public: inline void output(void) {cout<<"i is "<< i << "\n";} } 3、目的——空間換取時間的做法 引入內嵌函式的目的是為瞭解決程式中函數調用的效率問題。 函數是一種更進階的抽象。它的引入使得編程者只關心函數的功能和使用方法,而不必關心函數功能的具體實現;函數的引入可以減少程式的目標代碼,實現程式碼和資料的共用。但是,函數調用也會帶來降低效率的問題,因為調用函數實際上將程式執行順序轉移到函數所存放在記憶體中某個地址,將函數的程式內容執行完後,再返回到轉去執行該函數前的地方。這種轉移操作要求在轉去前要保護現場並記憶執行的地址,轉回後先要恢複現場,並按原來儲存地址繼續執行。因此,函數調用要有一定的時間和空間方面的開銷,於是將影響其效率。特別是對於一些函數體代碼不是很大,但又頻繁地被調用的函數來講,解決其效率問題更為重要。引入內嵌函式實際上就是為瞭解決這一問題。 在程式編譯時間,編譯器將程式中出現的內嵌函式的調用運算式用內嵌函式的函數體來進行替換。顯然,這種做法不會產生轉去轉回的問題,但是由於在編譯時間將函數體中的代碼被替代到程式中,因此會增加目標程式碼量,進而增加空間開銷,而在時間代銷上不象函數調用時那麼大,可見它是以目標代碼的增加為代價來換取時間的節省。
在程式中,調用其函數時,該函數在編譯時間被替代,而不是像一般函數那樣是在運行時被調用。 4、注意事項 內嵌函式具有一般函數的特性,它與一般函數所不同之處只在於函數調用的處理。一般函數進行調用時,要將程式執行權轉到被調用函數中,然後再返回到調用它的函數中;而內嵌函式在調用時,是將調用運算式用內嵌函式體來替換。在使用內嵌函式時,應注意如下幾點: 1.在內嵌函式內不允許用迴圈語句和開關語句。如果內嵌函式有這些語句,則編譯將該函數視同普通函數那樣產生函數調用代碼。遞迴函式(自己調用自己的函數)是不能被用來做內嵌函式的。內嵌函式只適合於只有1~5行的小函數。對一個含有許多語句的大函數,函數調用和返回的開銷相對來說微不足道,所以也沒有必要用內嵌函式實現。 2.內嵌函式的定義必須出現在內嵌函式第一次被調用之前。 3.本欄目講到的類結構中所有在類說明內部定義的函數是內嵌函式。 5、樣本中顯式內聯的方式時,函式宣告時並沒有加“inline”,而在實現時才加的“inline”。 在隱式內聯的樣本中,函式宣告和實現都在類中,即便不標識inline也會自動按inline處理。因此不是一種良好的編程風格。應該推薦按樣本1來的方式。 “inline 是一種“用於實現的關鍵字”,而不是一種“用於聲明的關鍵字”。”
//*********************************************************
6、inline函數的實現部分放在哪裡.h 還是.cpp? 這個問題非常有意思。經過實驗之後發現,按照原來的方式:在類.h標頭檔放入聲明,類.cpp中寫實現部分,結果在主函數main中使用該類函數的時候,會提示link2001的錯誤:error LNK2001: unresolved external symbol 。解決方案就是將實現部分也寫在類.h標頭檔中。至於為什麼,還不得而知。歡迎大家告知。
//*********************************************************
書接上文: 關於內嵌函式的定義,上次的說法是不全面的。 不一定必須是類相關的函數,也可以使用inline修飾。舉例: inline int maxvalue(int a,int b);//這個地方如果缺少inline,會按普通函數處理。 int main(int argc, char* argv[]) { printf("Hello World!\n"); printf("%d",maxvalue(100,102)); return 0; } inline int maxvalue(int a,int b) { return (a>b)?(a):(b); } 這樣的也是可以的。 所以inline的實現不是要限定在.h檔案中,也可以使cpp中。LNK2001的錯誤本質是找不到外部的符號。…… 外部的符號怎麼聲明進來呢?????? |