inline函數

我們看下面的函數,函數體中只有一行語句: 
    double Average(double total, int number){ 
      return total/number;
      } 
定義這麼簡單的函數有必要嗎?實際上,它還是有一些優點的:第一,它使程序更可讀;第二,它使這段代碼可以重複使用。但是,它也有缺點:當它被頻繁地調用的時候,由於調用函數的開銷,會對應用程序的性能(時間+空間效率,這兒特指時間)有損失。例如,Average在一個循環語句中重複調用幾千次,會降低程序的執行效率。


    那麼,有辦法避免函數調用的開銷嗎?對於上面的函數,我麼可以把它定義爲內聯函數的形式:
    inline double Average(double total, int number){
      return total/number;
    }
函數的引入可以減少程序的目標代碼,實現程序代碼的共享。
  函數調用需要時間和空間開銷,調用函數實際上將程序執行流程轉移到被調函數中,被調函數的代碼執行完後,再返回到調用的地方。這種調用操作要求調用前保護好現場並記憶執行的地址,返回後恢復現場,並按原來保存的地址繼續執行。對於較長的函數這種開銷可以忽略不計,但對於一些函數體代碼很短,又被頻繁調用的函數,就不能忽視這種開銷。引入內聯函數正是爲了解決這個問題,提高程序的運行效率。
    在程序編譯時,編譯器將程序中出現的內聯函數的調用表達式用內聯函數的函數體來進行替換。由於在編譯時將內聯函數體中的代碼替代到程序中,因此會增加目標程序代碼量,進而增加空間開銷,而在時間開銷上不象函數調用時那麼大,可見它是以目標代碼的增加爲代價來換取時間的節省。

◆總結:inline函數是提高運行時間效率,但卻增加了空間開銷。
       即inline函數目的是:爲了提高函數的執行效率(速度)。
非內聯函數調用有棧內存創建和釋放的開銷
在C中可以用宏代碼提高執行效率,宏代碼不是函數但使用起來像函數,編譯器用複製宏代碼的方式取代函數調用,省去了參數壓棧、生成彙編語言的CALL調用、返回參數、執行return等過程,從而提高速度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章