額外函式 函式呼叫帶來的額外開銷

2021-10-16 03:58:04 字數 1106 閱讀 8842

在程式設計中,函式(general function)是功能比較單一,使用比較普遍的**塊。如c語言中的printf,scanf就是最常見的函式,它們用於各類資料輸出和輸入,是很常用的的庫函式。

所謂函式呼叫,就是使用已經定義好的函式。

使用函式能夠避免將相同**重寫多次的麻煩,減少可執行程式的體積,但也會帶來程式執行時間上的開銷。

函式呼叫在執行時,首先要在棧中為形參和區域性變數分配儲存空間,然後還要將實參的值複製給形參,接下來還要將函式的返回位址(該位址指明了函式執行結束後,程式應該回到**繼續執行)放入棧中,最後才跳轉到函式內部執行。這個過程是要耗費時間的。

另外,函式執行 return 語句返回時,需要從棧中**形參和區域性變數占用的儲存空間,然後從棧中取出返回位址,再跳轉到該位址繼續執行,這個過程也要耗費時間。

總之,使用函式呼叫語句和直接把函式中的**重新抄寫一遍相比,節省了人力,但是帶來了程式執行時間上的額外開銷。

一般情況下,這個開銷可以忽略不計。但是,如果乙個函式內部沒有幾條語句,執行時間本來就非常短,那麼這個函式呼叫產生的額外開銷和函式本身執行的時間相比,就顯得不能忽略了。假如這樣的函式在乙個迴圈中被上千萬次地執行,函式呼叫導致的時間開銷可能就會使得程式執行明顯變慢。

c++內聯函式提供了另一種選擇。內聯函式是指用inline關鍵字修飾的函式。

內聯函式從源**層看,有函式的結構,而在編譯後,卻不具備函式的性質。內聯函式不是在呼叫時發生控制轉移,而是在編譯時將函式體嵌入在每乙個呼叫處。編譯時,類似巨集替換,使用函式體替換呼叫處的函式名。

因此,內聯函式的執行速度比常規函式稍快,但代價是需要占用更多記憶體。(如果程式在100個不同的地方呼叫同乙個內聯函式,則該程式將包含該函式**的100個副本)

以時間換取空間,或增加空間消耗來節省時間,這是計算機學科中常用的方法。

c語言學習筆記總結:編譯、鍊錶、指標、標準庫、時間、工具

函式呼叫時的開銷

問題引入 在學習c語言時,老師強調過呼叫函式時會有開銷,但是函式呼叫的開銷體現在哪幾個方面並不十分清楚!舉例說明 寫乙個兩數求和的 此 中不呼叫函式 include int main 該程式對應的反彙編如下 include int main 00ba1419 pop edi 00ba141a pop...

如何在Python函式執行前後增加額外的行為

首先來看乙個小程式,這個是計量所花費時間的程式,以下是以往的解決示例 from functools import wraps,partial from time import time def timing func none,frequencies 1 if func is none print ...

c 動態繫結的解析及虛函式帶來的開銷

每個支援虛函式的類 基類或派生類 都會有乙個其所有支援的虛函式指標的虛函式表,每個該類生成的物件都會隱含乙個虛函式指標,此指標指向其所屬類的虛函式表,當通過基類的指標或引用呼叫每個虛函式時,系統首先定位這個指標或引用真正對應的物件所隱含的虛函式指標,然後虛函式指標會根據這個虛函式的名稱,對這個虛函式...