/LTCG (連結時間程式碼產生)

使用 /LTCG 來執行整個程式優化,或建立設定檔引導優化 (PGO) 檢測、執行定型,以及建立以設定檔引導的優化組建。

語法

/LTCG[:{INCREMENTAL|NOSTATUS|STATUS|OFF}]

這些選項已自 Visual Studio 2015 起淘汰:

/LTCG:{PGINSTRUMENT|PGOPTIMIZE|PGUPDATE}

引數

INCREMENTAL
(選擇性)指定連結器只會將整個程式優化或連結時間程式碼產生 (LTCG) 套用至受編輯影響的檔案,而不是整個專案。 根據預設,指定時 /LTCG 不會設定此旗標,而且整個專案會使用整個程式優化連結。

NOSTATUS | STATUS
(選擇性) 指定連結器是否會顯示進度指示器,以顯示連結完成的百分比。 根據預設,不會顯示此狀態資訊。

OFF
(選擇性) 停用連結時產生程式碼。 連結器會將使用 /GL 編譯的所有模組視為在沒有該選項的情況下進行編譯,而且任何 MSIL 模組都會導致連結失敗。

PGINSTRUMENT
(選擇性) 此選項已自 Visual Studio 2015 起淘汰。 請改用 /LTCG/GENPROFILE/FASTGENPROFILE 來產生已檢測的組建,以進行設定檔引導式優化。 從檢測測試回合所收集的資料用來建立最佳化的映像。 如需詳細資訊,請參閱特性指引最佳化。 這個選項的簡短形式是 /LTCG:PGI

PGOPTIMIZE
(選擇性) 此選項已自 Visual Studio 2015 起淘汰。 請改用 /LTCG/USEPROFILE 來建置優化的映射。 如需詳細資訊,請參閱特性指引最佳化。 這個選項的簡短形式是 /LTCG:PGO

PGUPDATE
(選擇性) 此選項已自 Visual Studio 2015 起淘汰。 請改用 /LTCG/USEPROFILE 來重建優化的映射。 如需詳細資訊,請參閱特性指引最佳化。 這個選項的簡短形式是 /LTCG:PGU

備註

選項 /LTCG 會告知連結器呼叫編譯器並執行整個程式優化。 您也可以執行特性指引最佳化。 如需詳細資訊,請參閱特性指引最佳化

在下列例外狀況下,您無法將連結器選項新增至 的 PGO 組合 /LTCG ,而且 /USEPROFILE 在 先前的 PGO 初始化組合 /LTCG/GENPROFILE 選項中未指定:

使用 和 來建 /LTCG/USEPROFILE 置時,不需要指定任何搭配 /LTCG/GENPROFILE 選項來初始化 PGO 的連結器選項;這些選項都是隱含的。

本文的其餘部分將討論 由 /LTCG 所完成的連結時間程式碼產生。

/LTCG 隱含于 /GL

如果連結器已傳遞使用 或 MSIL 模組編譯的模組,連結器會叫用 /GL 連結時間程式碼產生(請參閱檔案 .netmodule 作為連結器輸入 )。 如果您未在將 或 MSIL 模組傳遞 /GL 至連結器時明確指定 /LTCG ,連結器最終會偵測到這種情況,並使用 /LTCG 重新開機連結。 明確指定 /LTCG 何時將 和 MSIL 模組傳遞 /GL 至連結器,以取得最快的建置效能。

為了更快速的效能,請使用 /LTCG:INCREMENTAL 。 此選項會告知連結器只重新優化受來源檔案變更影響的檔案,而不是整個專案。 此選項可大幅減少所需的連結時間。 此選項與累加連結 不同 。 如果您移除 /LTCG:INCREMENTAL 選項,也請移除任何 /LTCGOUT 選項,以改善建置時間和磁片使用率。

/LTCG 與 搭配 /INCREMENTAL 使用無效。

/LTCG 用來連結使用 /Og 、、 /O1/O2/Ox 編譯的模組時,會執行下列優化:

  • 跨模組內嵌

  • 跨程序的暫存器配置 (僅限 64 位元作業系統)

  • 自訂呼叫慣例 (僅限 x86)

  • 小型的 TLS 置換 (僅限 x86)

  • 堆疊雙重對齊 (僅限 x86)

  • 改進記憶體去除混淆 (為全域變數及輸入參數提供更好的介入資訊)

注意

連結器會決定編譯每個函式時所要使用的最佳化方式,並在連結時套用相同的最佳化方式。

使用 /LTCG/O2 會導致雙對齊優化。

如果 /LTCG 指定 和 /O1 ,則不會執行雙對齊。 如果應用程式中大部分的函式都是為了速度而編譯,但有幾個函式會針對大小進行編譯(例如,藉由使用 optimize pragma),編譯器會在呼叫需要雙重對齊的函式時,將針對大小優化的函式進行雙對齊。

如果編譯器可以識別函式的所有呼叫月臺,編譯器會忽略明確的呼叫慣例修飾詞,並嘗試優化函式的呼叫慣例:

  • 在暫存器內傳遞參數

  • 重新排列參數以對齊

  • 移除未使用的參數

如果函式是透過函式指標呼叫,或是從使用 /GL 編譯的模組外部呼叫函式,則編譯器不會嘗試優化函式的呼叫慣例。

注意

如果您使用 /LTCG 並重新定義 mainCRTStartup ,您的應用程式可能會有與初始化全域物件之前執行的使用者程式碼相關的無法預期行為。 有三種方式可以解決此問題:請勿重新定義 mainCRTStartup 、不要編譯 /LTCG 包含的 mainCRTStartup 檔案,或以靜態方式初始化全域變數和物件。

/LTCG 和 MSIL 模組

使用 /GL 編譯的模組,且 /clr 可在指定 時 /LTCG 當做連結器輸入使用。

  • /LTCG 可以接受原生物件檔案,以及混合原生/Managed 物件檔(使用 /clr 編譯)。 /clr:pure/clr:safe 編譯器選項在 Visual Studio 2015 中已被取代,Visual Studio 2017 和更新版本中不支援。

  • /LTCG:PGI 不接受使用 /GL 和 編譯的原生模組 /clr

在 Visual Studio 開發環境中設定這個編譯器選項

神秘le Program Optimization 屬性會設定數個編譯器和連結器選項,包括 /LTCG 。 建議您使用這個屬性來變更整個組建組態的設定。 若要為專案設定神秘程式優化:

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 設定編譯器和建置屬性

  2. 選取 [組態屬性]>[一般] 屬性頁。

  3. 修改 整個程式最佳化 屬性。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

您也可以在功能表列上選擇 [建 > 置設定檔引導優化],或在專案的快捷方式功能表上選擇其中一個 [設定檔引導優化 ] 選項,以套用 /LTCG 至特定組建。

若要個別啟用 [連結時間程式碼產生] 或設定特定的 [連結時間程式碼產生] 選項:

  1. 開啟專案的 [屬性頁] 對話方塊。

  2. 選取 [ 組態屬性連結器 > 優化 ] > 屬性頁。

  3. [連結時間程式碼產生 ] 屬性修改為下列其中一個選項:

    • Default
    • 使用快速連結時間程式碼產生 (LTCG:incremental)
    • 使用連結時間程式碼產生 (LTCG)
    • 設定檔引導優化 - 檢測 (LTCG:PGInstrument)
    • 設定檔引導優化 - 優化 (LTCG:PGOptimize)
    • 設定檔引導優化 - 更新 (LTCG:PGUpdate)
  4. 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

若要指定連結器是否顯示連結時間程式碼產生進度指示器:

  1. 開啟專案的 [屬性頁] 對話方塊。

  2. 選取 [ 組態屬性 > ] 連結器 > [一般 ] 屬性頁。

  3. 修改 [連結狀態] 屬性。 選擇 [確定 ] 或 [ 套用 ] 以儲存您的變更。

若要以程式方式設定這個編譯器選項

另請參閱

MSVC 連結器參考
MSVC 連結器選項