/LTCG
(鏈接時間程式代碼產生)
使用 /LTCG
來執行整個程式優化,或建立配置檔引導優化 (PGO) 檢測、執行定型,以及建立以配置檔引導的優化組建。
語法
/LTCG
[:
{INCREMENTAL
STATUS
OFF
|NOSTATUS
||}]
這些選項已自 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 開發環境中設定這個編譯器選項
整個程式優化屬性會設定數個編譯程式和連結器選項,包括 /LTCG
。 建議您使用這個屬性來變更整個組建組態的設定。 若要為您的項目設定整個程式優化:
開啟專案的 [屬性頁] 對話方塊。 如需詳細資訊,請參閱 設定編譯程式和建置屬性。
選取 [組態屬性]>[一般] 屬性頁。
修改 整個程式最佳化 屬性。 選擇 [確定] 或 [套用] 以儲存變更。
您也可以在功能表欄上選擇 [建>置配置檔引導優化],或在專案的快捷方式功能表上選擇其中一個 [配置檔引導優化] 選項,以套用/LTCG
至特定組建。
若要個別啟用 [鏈接時間程式代碼產生] 或設定特定的 [鏈接時間程式代碼產生] 選項:
開啟專案的 [屬性頁] 對話方塊。
選取 [組態屬性連結器>優化]>屬性頁。
將 [鏈接時間程式代碼產生 ] 屬性修改為下列其中一個選項:
- Default
- 使用快速連結時間程式代碼產生 (LTCG:incremental)
- 使用連結時間程式代碼產生 (LTCG)
- 設定檔案引導優化 - 偵測 (LTCG:PGInstrument)
- 設定檔案引導優化 - 優化 (LTCG:PGOptimize)
- 設定檔案引導優化 - 更新 (LTCG:PGUpdate)
選擇 [確定] 或 [套用] 以儲存變更。
若要指定連結器是否顯示連結時間程式代碼產生進度指示器:
開啟專案的 [屬性頁] 對話方塊。
選取 [組態屬性>] 連結器>[一般] 屬性頁。
修改 [鏈接狀態] 屬性。 選擇 [確定] 或 [套用] 以儲存變更。