Compile
在此階段,編譯器會將 source code 轉成 assembly code,而最佳化也是在此階段做。
這階段檢查語意語法,不檢查 link的對象。 例如 void f(int a, int b) 的 function。 f(1,2,3) 就是錯的。
但是在此階段 f 尚未實做是不會有問題的。結束後會產生 *.s
inline function
一般而言,function 定義完,使用前宣告,就可利用 link 呼叫該 function。但事實上我們知道 call function 這件事是需要成本的。
從傳遞參數,加入 return address, frame pointer , jump...。縱使什麼也不做,也會有一些基本的開銷,但是有時候我們也許會使用非常短的 function (如 getter or setter)。這時後這些基礎開銷似乎也佔了所有開銷的一大部分。因此若我們可以少去 "呼叫" 的成本,也許可以降低這樣的時間花費。
inline int fun(int x, int y)
{
return x + y;
}
在一般使用 function 時, link後,我們可以見到 compiler 將 function實作(assembly) 放到某處,而等待呼叫時 pc jump 至該處,做完後回來。而 inline的作用是,在 compile 階段,呼叫該 function 時,會直接將該 function 的 assembly code 放至呼叫處。也就是說,在高階 source 我們看到的是 "呼叫" 但是在 assembly 階段我們看到的是 "直接執行"。
-
也許你可以想像一個寫 code 的人,他從不寫function,而 main function 就是他唯一的 function。想當然爾會看到許多重複或是類似的 code 出現。這也反映了 inline 的問題,若 text 有硬體的限制,我們不該無止盡去使用 inline,會造成執行檔過大。(一般 PC 可能沒有類似問題,但是對韌體工程師而言,在某些平台上這也許是很嚴重的問題 )