每次編譯項目時,編譯器會把所有相關的文件復制進項目中並進行編譯,但其實,這些被編譯的文件中總有一些文件是不會變動的,比如標准庫、STL和一些我們自己寫的但基本不會更改的頭文件等等,可是這些文件卻要在每次編譯時都被重新包含進項目中並重新編譯。可不可以讓它們只被編譯一次?這樣就可以大大縮短編譯時間了。事實上確實可以,我們可以通過預編譯頭文件的方式做到這點。
以VS2019為例,進行自定義預編譯頭只需要三步:
- 創建文件:將希望預編譯的頭文件都包含到一個頭文件中,這里我們將它命名為mypch.h(pch: pre-compiled header);再新建一個cpp文件,命名為mypch.cpp,在其中包含mypch.h。
- 設置屬性:在mypch.cpp的屬性頁中,找到C/C++ -> 預編譯頭,預編譯頭選擇“創建(/Yc)”,預編譯頭文件填寫我們剛剛創建的mypch.h。在項目的屬性頁中按照2中方法找到預編譯頭,預編譯頭選擇“使用(/Yu)”,預編譯頭文件填寫mypch.h。
- 在項目的每個cpp文件的最開始加上
#include "mypch.h"
。
這就搞定了。然后就可以多次更改、編譯項目測試編譯時長看看效果如何,越是頭文件多的項目速度提升會越明顯。
但是,把所有頭文件都進行預編譯並不意味着優化,相反,這可能拖慢編譯速度。預編譯頭之所以可以大幅縮短編譯時間,在於它提前將一部分頭文件編譯好了,因此當你按下“Ctrl+B”后需要進行的工作就少了許多。但是,如果預編譯頭文件中的某個文件的內容進行了更改的話(或許只是在某個頭文件里加了個空行),那么預編譯頭文件中的所有文件都要進行重新編譯。
因此,只將不常變動的頭文件放進預編譯頭中,比如標准庫、STL或其他第三方庫,自己寫的頭文件最好不要放進去。