簡體   English   中英

如何在C ++中最小化編譯時間

[英]How to minimize compilation time in C++

我已經編碼了一個腳本,該腳本生成帶有常量的頭文件,例如version,svn標簽,內部版本號。 然后,我有一個用此信息創建字符串的類。

我的問題如下:在每次編譯中創建文件時,編譯器都會檢測到標頭已更改,並強制重新編譯大量文件。 我想問題出在頭文件的情況下。 我的項目是一個庫,標頭必須位於“與世界的接口”標頭文件中(它必須是公共的)。

我需要一些建議以最小化此編譯時間或減少強制重新編譯的文件。

在標題中輸入以下內容:

extern const char *VERSION;
extern const char *TAG;
extern const char *BUILD_DATE;

並創建一個將包含以下內容的.c(或.cpp)文件

const char *VERSION = "0.13";
const char *TAG = "v_0_13";
const char *BUILD_DATE = "2011-02-02 11:19 UTC+0100";

如果您的腳本更新了.c文件,則只需要重新編譯該文件,而不需要包含頭文件的文件。

在實現文件中生成常量。

確保標題不會被腳本更改。

解決此問題的最簡單方法是不在頭文件中創建這些常量。 而是在頭文件中創建獲取這些值的函數。 然后將值本身放在一個小的cpp文件中,該文件可以實現這些功能。 (或將它們放在僅包含在該cpp文件中的標頭中)。 重新編譯時,只需要重新編譯一個文件。

另外,如果您有幾台計算機要備用,則可以考慮使用distcc來加快編譯速度。

如果您使用的是gcc,則可以嘗試使用ccache 它基於預處理輸出的哈希值緩存目標文件,因此除非發生實際更改,否則不會重新編譯

另一種方法是聲明常量值,例如extern const double PI; 在您的標題(例如“ my_constants.h”)中,然后將一個cpp文件添加到項目中,其內容如下:

#include "my_constants.h"

const double PI = 3.1415926535;

然后,實際值將僅被編譯一次,並且更改值僅需要編譯該單個文件並再次鏈接項目。

如果要將其保留為單個公共頭文件,則可以添加一個預構建步驟,該步驟將使用您的公共頭文件並

  • 篩選出版本詳細信息(將其刪除或用固定的字符串替換)到文件的臨時副本
  • 僅當標題已更改時才將其移動到標題的內部版本,即除非該版本以外的其他內容未更改,否則請勿復制文件(+更新時間戳記)

然后從此內部頭文件構建您的預編譯頭。 對於需要版本的源文件,您仍然可以將public標頭與版本詳細信息一起使用。

如果您使用的是Unix,則可以在GCC源代碼中使用經過移動替換的腳本,也可以借用此腳本,也可以在Windows的批處理文件中使用fc來建​​立一些腳本。

面向對象的解決方案:

通常,應將那些經常刷新的cnstant放入cpp文件,而不是h。 例如,將它們放入課堂。 如果您已經有一個創建字符串的類並通過方法將其發布的類,則可以將所有這些常量放入同一cpp並添加一些公共方法以從其他源文件訪問它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM