1.函式呼叫原理
"編譯過程的最終產品是可執行程式--由一組機器語言指令組成。執行程式時,作業系統將這些指令載入計算機記憶體中,因此每條指令都有特定的記憶體位址。計算機隨後將逐步執行這些指令。有時(如有迴圈和分支語句時),將跳過一些指令,向前或向後跳到特定位址。常規函式呼叫也使程式跳到另乙個位址(函式的位址),並在函式結束時返回。下面更詳細地介紹這一過程的典型實現。執行到函式呼叫指令時,程式將在函式呼叫後立即儲存該指令的記憶體位址,並將函式引數複製到堆疊(為此保留的記憶體塊),跳到標記函式起點的記憶體單元,執行函式**(也許還需將返回值放入暫存器中),然後跳回到位址被儲存的指令處(這與閱讀文章時停下來看腳注,並在閱讀完腳注後返回到以前閱讀的地方類似)。來回跳躍並記錄跳躍位置意味著以前使用函式時,需要一定的開銷。"
2.內聯函式
內聯函式提供了另一種選擇。編譯器將使用相應的函式**替換函式呼叫。因此,內聯函式的執行速度比常規函式稍快,但代價是需要占用更多記憶體。
3.內聯函式的使用
在函式宣告前加上關鍵字inline;
在函式定義前加上關鍵字inline。
示例如下:
#includeinline程式輸出結果如下:double square(double x)
intmain()
a=25,b=144
c=13
c square=169
now c=14
4.內聯函式與巨集定義的區別
c語言使用預處理器語句#define來提供巨集。如下例所示:
#define square(x) x*x
巨集定義時通過文字替換開實現的--x是引數的符號標記。
a = square(5.0);->a=5.0*5.0;
b = square(4.5+7.5);->b=4.5+7.5*4.5+7.5
d = square(c++);->d=c++*c++
可以看出,對於b,需要使用括號才能正常運算。
#define square(x) ((x)*(x))
對於c,卻仍遞增了兩次。
因此,巨集定義和內聯函式存在本質的區別,轉換的時候應考慮是否轉換後功能是否正常。
5.什麼時候使用內聯函式
如果執行函式**的時間比處理函式呼叫機制的時間長,則節省的時間佔比很小。若**執行時間很短,則內聯函式就可以節省函式呼叫的時間。
C 內聯函式詳解
1.函式呼叫原理 編譯過程的最終產品是可執行程式 由一組機器語言指令組成。執行程式時,作業系統將這些指令載入計算機記憶體中,因此每條指令都有特定的記憶體位址。計算機隨後將逐步執行這些指令。有時 如有迴圈和分支語句時 將跳過一些指令,向前或向後跳到特定位址。常規函式呼叫也使程式跳到另乙個位址 函式的位...
C 內聯函式詳解
1.函式呼叫原理 編譯過程的最終產品是可執行程式 由一組機器語言指令組成。執行程式時,作業系統將這些指令載入計算機記憶體中,因此每條指令都有特定的記憶體位址。計算機隨後將逐步執行這些指令。有時 如有迴圈和分支語句時 將跳過一些指令,向前或向後跳到特定位址。常規函式呼叫也使程式跳到另乙個位址 函式的位...
C 內聯函式(inline)詳解
內聯函式 函式呼叫是有時間和空間開銷的。程式在執行乙個函式之前需要做一些準備工作,要將實參 區域性變數 返回位址以及若干暫存器都壓入棧中,然後才能執行函式體中的 在函式體中的 執行完畢後還要恢復現場,將之前壓入棧中的資料都出棧,才能接著執行函式呼叫位置以後的 內聯函式是c 為提高程式執行速度所做的一...