inline 是**實現細節關鍵字**,不應出現在聲明中。// ❌ 錯誤:inline 僅在聲明,定義體無 inline → 不內聯
// Foo.h
inline void Foo(int x, int y);
// Foo.cpp
void Foo(int x, int y) { /* ... */ }
// ✅ 正確:inline 與定義體在一起
// Foo.h
void Foo(int x, int y); // 聲明無 inline
inline void Foo(int x, int y) { /* ... */ } // 定義有 inline
// ✅ 更佳:定義直接在聲明中(隱式 inline)
// Foo.h
class A {
void Foo(int x, int y) { /* ... */ } // 類內定義自動 inline
};
inline;inline;inline 放在頭文件——分離接口與實現,避免頭文件膨脹。// A.h
class A {
public:
void Foo(int x, int y); // 僅聲明
};
// A.h (續) 或 A.inl
inline void A::Foo(int x, int y) { /* 實現 */ }
static 拷貝,新標準要求單一定義。| 收益 | 代價 |
|---|---|
| 消除調用開銷(指令流水線友好) | 代碼膨脹 → 指令緩存未命中、二進制體積增大 |
| 啟用後續優化(常量傳播、死碼消除、向量化) | 編譯時間增加、調試符號膨脹 |
getter/setter、operator[]、簡單數學運算;inline 是「用於實現的關鍵字」,**定義放在頭文件、與定義體同行、類外顯式標記、類內僅聲明**。現代編譯器極其智能,**盡信書不如無書**——專注寫清晰、正確、可測試的代碼,關鍵熱點經 Profile 確認後再考慮強制 __forceinline/__attribute__((always_inline))。