/OPT (最佳化)

控制 LINK 在組建期間執行的最佳化。

語法

/OPT: { REF | NOREF }
/OPT: { ICF [ = 反覆運算 ] | NOICF }
/OPT: { LBR | NOLBR }

引數

REF | NOREF

/OPT:REF 會排除從未參考的函式和資料; /OPT:NOREF 會保留從未參考的函式和資料。

啟用 /OPT:REF 時,LINK 會移除未參考的封裝函式和資料,稱為 COMDAT 。 這種最佳化稱為可轉移 COMDAT 刪除。 /OPT:REF 選項也會停用累加連結。

在類別宣告內定義的內嵌函式和成員函式一律為 COMDAT。 如果物件檔中的所有函式是使用 /Gy 選項編譯的,就會轉換成 COMDAT。 若要將資料放在 const COMDAT 中,您必須使用 __declspec(selectany) 來宣告資料。 如需如何指定移除或折迭資料的相關資訊,請參閱 selectany

根據預設, 除非 指定 /OPT:NOREF /DEBUG ,否則連結器會啟用 /OPT:REF 。 若要覆寫此預設值,並在程式中保留未參考的 COMDAT,請指定 /OPT:NOREF 。 您可以使用 /INCLUDE 選項來覆寫移除特定符號。

如果 指定 /DEBUG ,則 /OPT 預設值為 NOREF ,而且所有函式都會保留在映射中。 若要覆寫此預設值並優化偵錯組建,請指定 /OPT:REF 。 這可以減少可執行檔的大小,而且即使在偵錯組建中,也可以是有用的優化。 建議您也指定 /OPT:NOICF ,以在偵錯組建中保留相同的函式。 這可讓您更容易讀取堆疊追蹤,並且在會摺疊在一起的函式中設定中斷點。

ICF [ = 反覆運算 ] | NOICF

使用 ICF [ = 反覆運算 ] 來執行相同的 COMDAT 折迭。 重複的 COMDAT 可以從連結器輸出中移除。 選擇性 反覆運算 參數會指定周遊重複專案符號的次數。 反覆運算的預設數目為 1。 其他反覆項目可能會找出更多經由先前反覆項目中摺疊所揭露的重複項目。

根據預設, 除非 指定 /OPT:NOICF /DEBUG ,否則連結器會啟用 /OPT:ICF 。 若要覆寫此預設值,並防止 COMDAT 折迭在程式中,請指定 /OPT:NOICF

在偵錯組建中,您必須明確指定 /OPT:ICF 以啟用 COMDAT 折迭。 不過,因為 /OPT:ICF 可以合併相同的資料或函式,所以它可以變更堆疊追蹤中顯示的函式名稱。 它也可以讓某些函式中的中斷點無法設定中斷點,或檢查偵錯工具中的某些資料,而且可以在您單一步驟執行程式碼時帶您進入非預期的函式。 程式碼的行為完全相同,但偵錯工具呈現可能會非常令人困惑。 因此,建議您不要在偵錯組建中使用 /OPT:ICF ,除非較小的程式碼的優點超過這些缺點。

注意

因為 /OPT:ICF 可能會將相同的位址指派給不同的函式或唯讀資料成員(也就是 const 使用 /Gy 編譯時變數),所以它可以中斷程式,而程式會相依于函式或唯讀資料成員的唯一位址。 如需詳細資訊,請參閱 /Gy (啟用函式階層連結)

LBR | NOLBR

/OPT:LBR /OPT:NOLBR 選項僅適用于 ARM 二進位檔。 由於某些 ARM 處理器分支指令的範圍有限,如果連結器偵測到跳至超出範圍的位址,它會將分支指令的目的地位址取代為代碼 「island」 的位址,其中包含以實際目的地為目標的分支指令。 您可以使用 /OPT:LBR 來優化長分支指令的偵測,以及中繼程式碼島的位置,以將整體程式碼大小降到最低。 /OPT:NOLBR 會指示連結器在遇到長分支指令時產生程式碼島,而不需優化。

根據預設,未啟用累加連結時, 會設定 /OPT:LBR 選項。 如果您想要非累加連結,但不是長時間的分支優化,請指定 /OPT:NOLBR /OPT:LBR 選項會停用累加連結。

備註

在命令列使用時,連結器預設為 /OPT:REF,ICF,LBR 。 如果 指定 /DEBUG ,預設值為 /OPT:NOREF、NOICF、NOLBR

/OPT 優化通常會減少影像大小,並增加程式速度。 這些改進在較大的程式中可能相當重要,這就是為什麼它們預設會針對零售組建啟用。

連結器優化確實需要額外的時間,但優化程式碼也會在連結器有較少的重新配置來修正和建立較小的最終映射時節省時間,而且當連結器處理和寫入 PDB 時,會節省更多時間。 啟用優化時,整體連結時間可能會加快連結時間,因為分析中較小的額外成本可能會因連結器通過較小的二進位檔所節省的時間所抵消。

/OPT 引數可以一起指定,並以逗號分隔。 例如,您可以指定 /OPT:REF,NOICF ,而不是 /OPT:REF /OPT:NOICF

您可以使用 /VERBOSE 連結器選項來查看 /OPT:REF 移除 的函式,以及由 /OPT:ICF 折迭 的函式。

/OPT 引數通常會針對使用 Visual Studio IDE 中的 [新增專案 ] 對話方塊所建立的專案設定,而且通常有不同的偵錯和發行組態值。 如果您的專案中沒有設定這些連結器選項的值,您可能會取得專案預設值,這與命令列連結器所使用的預設值不同。

在 Visual Studio 開發環境中設定 OPT:ICF 或 OPT:REF 連結器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

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

  3. 修改其中一個屬性:

    • 啟用 COMDAT 折迭

    • 參考

在 Visual Studio 開發環境中設定 OPT:LBR 連結器選項

  1. 開啟專案的 [屬性頁] 對話方塊。 如需詳細資料,請參閱在 Visual Studio 中設定 C ++ 編譯器和組建屬性

  2. 選取 [ 組態屬性 > 連結器 > 命令列 ] 屬性頁。

  3. 在 [其他選項 ] 中 輸入選項:

    /opt:lbr/opt:nolbr

若要以程式設計方式設定這個連結器選項

另請參閱