Home > C++ | 遊戲編程 > 關於表頭檔的 inline function

關於表頭檔的 inline function

閱讀了猴子靈藥《表頭檔要不要?拿速度來換!》後,發覺所言甚是,表頭檔的問題許多時會被忽略。現在寫的代碼,除了考慮執行效率,也應該要考慮編譯效率。

關於在標頭檔寫 inline function 而增加編譯時間,本人有一點看法,就在此和大家分享。

首先,我們知道

Inline function 的目的是增加執行效率,但一般在 debug 版本是不會被展開的,只有在 Release mode 才會用到。

那麼,在編譯 debug 版本中使用 inline function 只會增加編譯的時間。基於這一點,我現時的”引擎” (不知何時才能算是真正的引擎,可以去除引號)的代碼 layout 就使用 macro 去解決這個問題。所有類別的代碼 layout 分為 3 個檔案: header (.h), inline (.inl) 和 implementation (.cpp)。例如:

// A.h
#include "Config.h"

class A {
public:
    void func1(); // a inline function
    void func2(); // a non-inline function
};

#ifdef INCLUDE_INLINE
#   include "A.inl"
#endif
// A.inl
INLINE void A::func1() {
    // ...
}
// A.cpp
#include "A.h"

#ifndef INCLUDE_INLINE
#   include "A.inl"
#endif

void A::func2() {
    // ...
}

注意: .h 裡是 #ifdef,而 .cpp 裡是 #ifndef。即是,有一方會包含 inline 檔。

在 Config.h 裡,需要定義可時才真正使用 inline:

// Config.h
#if defined(NDEBUG)
#	define INCLUDE_INLINE
#	define INLINE inline
#else
#	define INLINE
#endif

這個 layout 的好處除了能增加 debug 版本編譯的速度外,亦可以使表頭檔的類別定義更加清楚 (沒有了 inline keyword、或在類別內實作函式)。有需要的話,可加入幾個級別的 INLINE macro,例如 Visual C++ 除了 inline keyword 外還加入了 __forceinline。

Comments:5

半路 08-04-02 (三) 20:20

真是絕妙好方法!
這樣就可以在 debug 時節省編譯時間,然後又可在 release 模式下獲得 inline 化的函式呼叫效能,果然是很棒的方法~

Ricky 08-04-06 (日) 1:25

It would be interesting to know the performance difference once your project have a certain line of code..

Milo 08-04-07 (一) 20:56

是的,要等到用這個方法的Project到了一定規模,就可以 profile 一下。又或者可以寫個 program generate 一些檔案出來做實驗…

Jiapon 08-12-15 (一) 22:21

抱歉問個比較淺的問題~~

為什麼不是直接寫實作 INLINE void A::func1() 在.cpp裡面呢

這樣define的結果不是一樣嗎?為何inline的話就要在.h裡寫實作
不inline就在cpp裡實作呢?

Milo 08-12-15 (一) 23:06

因為一個 inline function 在一個 .cpp 檔裡實作的話, 其他 .cpp 只 include header 是不能展開這 inline function 的,而只能把它當作是普通 function 鏈結。

這關係到 C++ 的 compilation unit 問題,可看看我朋友的這篇文章 http://rdescartes.seezone.net/?p=7

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://miloyip.seezone.net/wp-trackback.php?p=47
Listed below are links to weblogs that reference
關於表頭檔的 inline function from Milo的遊戲開發

Home > C++ | 遊戲編程 > 關於表頭檔的 inline function

Search
Feeds
Meta

Return to page top