首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++Builder 透過預編譯標頭(PCH)大幅縮短編譯時間的完整優化指南

     編輯:關於C++

C++ 編譯速度較 Delphi 慢的主因在於 #include 機制:每個 .cpp 獨立編譯時都必須重複解析包含的標頭檔(含遞迴包含),大型專案中 VCL、Windows SDK、STL 標頭檔動輒數十萬行。預編譯標頭(Precompiled Headers, PCH)將常用標頭檔的編譯中間映像快取至磁碟,後續 .cpp 直接載入映像,可大幅減少重複解析。

PCH 運作原理與匹配規則

  • 編譯器從 .cpp 開頭開始解析 #include,直到遇到 #pragma hdrstop 為止,將此區段的編譯結果存為 .csm 快取檔。
  • 下一個 .cpp 若其 #pragma hdrstop 之前的 #include 序列(含順序、巨集定義)完全相同,即可重用快取。
  • 任何差異(順序不同、多/少 include、巨集定義不同)都會導致快取失效,重新產生新映像。

兩大優化技術

技術一:擴展 VCL 內建 PCH 範圍(簡單但需修改每個 .cpp)

在每個 .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(彈性、集中維護)

  1. 建立 PCH.h 包含專案所有常用標頭:VCL 核心、Windows SDK、STL、第三方庫、自訂通用標頭。
  2. 所有 .cpp 統一:#include "PCH.h"\n#pragma hdrstop
  3. 若某些標頭頻繁變動(如專案自訂標頭),可用 #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

注意事項

  • 不要預編譯經常變動的標頭檔(如專案自訂 .h),否則每次修改都會觸發全專案重編。
  • 專案選項啟用 Use pre-compiled headers 與 Cache pre-compiled headers。
  • 大型專案建議配合「統一編譯」或模組化架構進一步優化。

實測:啟用優化後,大型 VCL 專案全量編譯時間常可縮減 50%~70%。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved