什麼是行內函數行內函數的動機

  行內函數是指用inline關鍵字修飾的函式。在類內定義的函式被預設成行內函數。那麼你對內聯函數了解多少呢?以下是由小編整理關於什麼是行內函數的內容,希望大家喜歡!

  行內函數的定義

  行內函數從原始碼層看,有函式的結構,而在編譯後,卻不具備函式的性質。行內函數不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在每一個呼叫處。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。一般在程式碼中用inline修飾,但是能否形成行內函數,需要看編譯器對該函式定義的具體處理。

  行內函數的動機

  內聯擴充套件是用來消除函式呼叫時的時間開銷。它通常用於頻繁執行的函式。 一個小記憶體空間的函式非常受益。

  如果沒有行內函數,編譯器可以決定哪些函式內聯 。 程式設計師很少或沒有控制哪些只能是內聯的,哪些不是。 給這種控制程度,作用是程式設計師可以選擇內聯的特定應用 。

  函式內聯問題

  除了 相關的問題, 內聯擴充套件一般,語言功能作為一個行內函數可能不被視為有價值的,因為它們出現的原因,對於一個數字:

  通常,一個編譯器是在一個比人類更有利的地位來決定某一特定功能是否應該被內聯。 有時,編譯器可能無法儘可能多的功能內嵌作為程式設計師表示。

  程式碼***行內函數***得到暴露其客戶端***呼叫函式***。隨著功能的演變,它們有可能成為合適的內聯,他們不前,或不再在他們面前的內聯合適。 而內聯或取消行內函數比從巨集轉換為更容易,但仍需要額外的維修,一般產量相對較少的利益。

  用於本機C型編譯系統的擴散可以增加編譯時間,因為他們的身體的中間表示是到每個呼叫點,他們都是內聯複製行內函數。在程式碼大小可能增加是由在編譯時間可能增加映象。

  C++中內嵌的規範要求只有一個額外在另一個編譯單元,功能的外部定義時,相應的內聯定義,可以發生在不同的編譯單元多次,如果該函式用於地方。這很容易導致聯結器,因為這樣的定義不是由程式設計師提供的錯誤。 出於這個原因,往往是在C99內聯一起使用靜態的,也給出了函式的內部聯絡。

  在C + +,有必要定義一個在每一個模組***編譯單元***行內函數使用一個普通的功能,而必須在只有一個模組中定義它。否則,就不可能編制的所有其他模組一個模組獨立。

  對於功能問題與優化本身,而不是語言,請參閱使用內聯擴充套件問題 。

  行內函數是使用inline關鍵字宣告的函式,也成內嵌函式,它主要的作用是解決程式的執行效率。

  1.遞迴函式不能定義為行內函數

  2.行內函數一般適合於不存在while和switch等複雜的結構且只有1~5條語句的小函式上,否則編譯系統將該函式視為普通函式。

  3.行內函數只能先定義後使用,否則編譯系統也會把它認為是普通函式。

  4.對行內函數不能進行異常的介面宣告。

  使用行內函數應注意的事項

  行內函數具有一般函式的特性,它與一般函式所不同之處只在於函式呼叫的處理。一般函式進行呼叫時,要將程式執行權轉到被呼叫函式中,然後再返回到呼叫它的函式中;而行內函數在呼叫時,是將呼叫表示式用行內函數體來替換。在使用行內函數時,應注意如下幾點: 1.在行內函數內不允許用迴圈語句和開關語句。 如果行內函數有這些語句,則編譯將該函式視同普通函式那樣產生函式呼叫程式碼,遞迴函式***自己呼叫自己的函式***是不能被用來做行內函數的。行內函數只適合於只有1~5行的小函式。對一個含有許多語句的大函式,函式呼叫和返回的開銷相對來說微不足道,所以也沒有必要用行內函數實現。 2.行內函數的定義必須出現在行內函數第一次被呼叫之前。 3.本欄目講到的類結構中所有在類說明內部定義的函式是行內函數。

行內函數的動機