2011年11月5日 星期六

C++ inline 用法背後的原因

看過編出來的組語碼後, 深刻感受到 inline 可以省掉大量操作記憶體的時間, 特別是函式內容簡短又常被呼叫的話, 也許在 stack 上操作記憶體的時間比實際運算的還久。

初學 inline 語法讓我很困惑, 它是如此地令人困惑以致於 FAQ 裡有數則說明:

令人困惑的點在於, 無論是 non-member function 或 member function, 若要使用 inline, 函式的定義都要寫在 header 裡。否則 compiler 在編譯時會抱怨「undefined reference to ...」 -- 一個不明確的錯誤訊息。

直到看了 compiler 和 linker 運作的基礎知識後, 才明白是怎麼回事。原因是 compiler 一次處理一個 .cpp 檔以及它引入的 header (由前處理器引進來的, 所以其實還是只有處理一份原始碼檔案)。所以在使用 inline 且函式定義寫在另一個 cpp 檔時, compiler 無法進行 inline 最佳化。也許是為了方便實作 compiler / linker (或為了符合既有的工具?), 而如此設定 inline 的語法吧。

附帶一提, 看了《淺談 GCC 編譯技術 Break Compilation Boundaries with GCC》才知道 compiler optimization 有分不同層級, 像是 Link-time optimization。若要移除沒用到的程式, 就得在 link-time 才能確定某些程式真的沒有被用到。

2 則留言:

  1. 所以你 compiler 沒在上課齁

    回覆刪除
  2. 你是上 A 班還 B 班? 我們那時候有教這個嗎? 這門課大概是我上完記憶最薄弱的 Orz

    回覆刪除

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...