在c 中普通函式與 內聯函式的區別

2021-08-09 18:31:05 字數 852 閱讀 3475

我們都知道編譯的最終產品是可執行程式——— 由一組由機器語言指令組成,在執行程式時,作業系統將這些指令載入到計算機記憶體中。因此,每一組指令都有乙個特定的記憶體位址。

一.普通函式的呼叫

a.當**執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的位址,同時將引數複製到堆疊中;

b.然後跳到標記函式起點的記憶體單元當中,執行函式**,將返回值放回到暫存器當中;

c.跳回到位址被儲存的指令處

為了能夠對這個執行過程有更加明確的理解,我在這裡舉個例子:

比如我們在看一篇文章的時候,有個片語的意思我們不理解,這時候我們就需要會去看書下面給的注釋,在閱讀完注釋後我們就會很快的返回的當時正在閱讀的地方。這和普通函式在呼叫過程中的原理非常相似。

因此,在使用普通函式時由於需要來回跳轉所以它的執行速度比較慢,特別是需要呼叫很多次函式時。

二.內聯函式的呼叫

1.如何才能使用內聯函式?

a,在函式宣告前加上關鍵字 inline

b.在函式定義前加上關鍵字 inline

以上兩種方法任選其一即可。

2.呼叫原理

內聯函式,顧名思義就是將編譯**和其它** 「內聯」 起來了。所以它在呼叫的時候是編譯器使用相應的函式**替換函式呼叫。(這一點和巨集替換十分相似)

由於內聯**在執行的時候程式無需進行來回的跳轉,所以它的執行速度相對於普通函式能快點;不過它也有自己的缺點,那就是對記憶體得耗損,如果程式需要在十個地方呼叫同乙個內聯函式,那這個程式將會將這個**拷貝10次

下面我通過一張來更加清楚的描述下普通函式和內聯函式兩者的區別

內聯函式(inline)與普通函式的區別

內聯函式是 被插入到呼叫者 處的函式。如同 define 巨集,內聯函式通過避免被呼叫的開銷來提高執行效率,尤其是它能夠通過呼叫 過程化整合 被編譯器優化。內 聯函式和巨集很類似,而區別在於,巨集是由預處理器對巨集進行替代,而內聯函式是通過編譯器控制來實現的。而且內聯函式是真正的函式,只是在需要用到...

內聯函式和普通函式的區別

1.普通函式在編譯後會被放到 段,然後函式執行過程中呼叫普通函式是需要先壓棧,然後根據函式呼叫位址呼叫函式,函式返回後執行出棧操作。這樣就會存在乙個呼叫過程,有時間消耗。2.內聯函式是 被插入到呼叫者 處的函式。如同 define 巨集,內聯函式通過避免被呼叫的開銷來提高執行效率。3.內聯函式和巨集...

內聯函式和普通函式的區別

1.內聯函式和普通函式的引數傳遞機制相同,但是編譯器會在每處呼叫內聯函式的地方將內聯函式內容展開,這樣既避免了函式呼叫的開銷又沒有巨集機制的缺陷 2.普通函式在被呼叫的時候,系統首先要到函式的入口位址去執行函式體,執行完成之後再回到函式呼叫的地方繼續執行,函式始終只有乙個複製。內聯函式不需要定址,當...