1. 編譯緩慢的根源
- 模板機制:聲明與實現必須同在頭文件,導致大量代碼重複實例化、編譯。修改頭文件觸發所有依賴單元重編譯。
- 頭文件包含模型:遞歸包含導致同一代碼被反復解析。模塊化(C++20 Modules)才是根治之道。
2. 封裝缺陷
私有成員寫在類定義中,任何私有變更都導致所有包含該頭文件的單元重編譯(即使公共接口未變)。
對比:C 語言不透明指針 / GObject 私有結構體指針,實現真正的二進制兼容封裝。
3. 缺乏原生反射
- 無法在運行期枚舉類成員、調用方法、序列化。
- 大型項目(如 Qt、Unreal、Firefox)被迫自建反射系統(MOC、UHT、XPCOM),增加復雜度。
- C++20 仍無標準反射提案落地。
4. 跨平台困難
- 基本類型大小隨 ABI 變化(`int`/`long`/`pointer`)。需用 `` 固定寬度類型。
- 結構體內存對齊規則編譯器相關,`#pragma pack` 非標準。
- 異常處理 ABI 不兼容(Itanium vs MSVC)。
- 寬字符 `wchar_t` 大小/編碼不一(Windows 16-bit UTF-16,Linux 32-bit UTF-32)。
緩解策略
- **PIMPL 惯用法**:將私有成員移至實現類,頭文件僅持有前向聲明指針,實現物理封裝、減少編譯依賴。
- **預編譯頭 (PCH)**:加速大型項目編譯。
- **統一構建**:將多個 `.cpp` 包含到單一編譯單元,減少重複解析。
- **使用成熟庫**:Boost、Qt、Abseil 封裝了平台差異。
- **避免濫用模板**:關鍵路徑用模板,業務邏輯用多態/類型擦除。