在看過編出來的組語碼後, 深刻感受到 inline 可以省掉大量操作記憶體的時間, 特別是函式內容簡短又常被呼叫的話, 也許在 stack 上操作記憶體的時間比實際運算的還久。
初學 inline 語法讓我很困惑, 它是如此地令人困惑以致於 FAQ 裡有數則說明:
- [9.6] How do you tell the compiler to make a non-member function inline?
- [9.7] How do you tell the compiler to make a member function inline?
- [9.8] Is there another way to tell the compiler to make a member function inline?
令人困惑的點在於, 無論是 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 才能確定某些程式真的沒有被用到。
所以你 compiler 沒在上課齁
回覆刪除你是上 A 班還 B 班? 我們那時候有教這個嗎? 這門課大概是我上完記憶最薄弱的 Orz
回覆刪除