簡體   English   中英

預編譯頭和預編譯二進制文件之間的區別是什么

[英]What Is the difference between pre-compiled headers and pre-compiled binaries

Wiki引用提到某些頭文件有時可能包含大量源代碼,因此將它們作為預編譯頭文件可以節省編譯時間。 https://en.wikipedia.org/wiki/Precompiled_header

如果預編譯頭可以包含已編譯的源代碼,那么它與預編譯的二進制文件有何不同。

C ++定義了“翻譯單元”的概念。 翻譯單元是翻譯開始的錨點,並且程序通常包括若干這樣的翻譯單元。 哪些單元作為“轉換單元”傳遞給編譯器實際上取決於IDE,makefile和其他配置中的設置。 但非正式地,大多數配置都將.cpp.c - 文件作為翻譯單元。

為了使其更容易,我們可以將翻譯單元視為編譯器生成二進制文件的一種方式,然后鏈接器將多個二進制文件組合到一個程序中。

因此,頭文件通常不被配置為轉換單元,並且它們通常不會自己生成二進制文件,即使它們包含源代碼。 它們被認為是從翻譯單元導入的,並將與它們一起編譯。

如果這樣的頭文件包含許多源代碼,它們將被包含在幾個翻譯單元中,那么(預)編譯它們一次並在中間結果中保留盡可能多的信息是有意義的,這樣編譯實際翻譯單位更快。 這節省了時間,但“中間二進制”是內部的,沒有暴露。

但是,根據其中的源代碼的內容和類型,頭文件與其他源代碼文件無法區分。 您可以將“頭文件”作為轉換單元傳遞給編譯器,編譯器實際上會從中生成“普通”二進制文件。 它實際上只是通常不會被聲明為編譯的根。

希望有所幫助。

與編譯源相比,主要區別在於預編譯頭中存儲的信息越多。 如果您將源代碼編譯為二進制信息,那么定義和模板就會丟失。 定義為其值而消失,模板僅以實例化形式獲取到二進制文件。 如果預編譯頭部包含在某處,則預編譯頭將保留有關模板的通用形式以及定義的名稱和值的信息。 對於純源預編譯頭與編譯源相同。

暫無
暫無

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

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