C++ 編譯速度較 Delphi 慢的主因在於 #include 機制:每個 .cpp 獨立編譯時都必須重複解析包含的標頭檔(含遞迴包含),大型專案中 VCL、Windows SDK、STL 標頭檔動輒數十萬行。預編譯標頭(Precompiled Headers, PCH)將常用標頭檔的編譯中間映像快取至磁碟,後續 .cpp 直接載入映像,可大幅減少重複解析。
#include,直到遇到 #pragma hdrstop 為止,將此區段的編譯結果存為 .csm 快取檔。#pragma hdrstop 之前的 #include 序列(含順序、巨集定義)完全相同,即可重用快取。在每個 .cpp 最頂端(#include <vcl.h> 之前)加入:
#define INC_VCLDB_HEADERS // 包含資料庫標頭
#define INC_VCLEXT_HEADERS // 包含擴充控制項標頭
// #define INC_OLE_HEADERS // 包含 COM/OLE 標頭
#include
#pragma hdrstop
或在專案選項「Conditional Defines」加入上述巨集,效果相同。可再手動加入常用 C RTL 標頭(windows.h, string.h…)於 hdrstop 之前,但必須確保全專案順序一致。
PCH.h(彈性、集中維護)PCH.h 包含專案所有常用標頭:VCL 核心、Windows SDK、STL、第三方庫、自訂通用標頭。#include "PCH.h"\n#pragma hdrstop#ifdef PRECOMPILE_ALL 條件排除,避免頻繁使快取失效。// PCH.h 範例
#ifndef PCH_H
#define PCH_H
#include // 或拆解包含 vcl0.h 內容
#include
#include
#include
#include "3rdParty/StBase.hpp"
#include "Common/BaseData.h"
// 自訂標頭若常改動,建議不放這裡
#endif
Use pre-compiled headers 與 Cache pre-compiled headers。實測:啟用優化後,大型 VCL 專案全量編譯時間常可縮減 50%~70%。