/OPT (最佳化)
更新:2007 年 11 月
控制 LINK 在組建期間執行的最佳化。
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}
引數
REF | NOREF
/OPT:REF 會排除永遠不會參考的函式及/或資料,而 /OPT:NOREF 則會保留永遠不會參考的函式及/或資料。依預設值,LINK 會移除未參考的封裝函式。如果目的檔是以 /Gy 選項編譯的,就會含有封裝函式 (COMDAT)。這種最佳化稱為可轉移 COMDAT 排除。若要覆寫這項預設並且讓未參考的 COMDAT 保留在程式中,請指定 /OPT:NOREF。您可以使用 /INCLUDE 選項,覆寫對特定符號的移除。
如果指定了 /DEBUG,則 /OPT 的預設值為 NOREF (否則為 REF),而且所有函式都會保留在映像中。若要覆寫預設值,並最佳化偵錯組建,請指定 /OPT:REF。/OPT:REF 選項會停用累加連結。
您必須明確地將資料標記為 COMDAT;請使用 __declspec(selectany)。
如果指定了 /OPT:REF,則 /OPT:ICF 預設為開啟。如果您要 /OPT:REF,但不要 /OPT:ICF,則必須指定下列各項:
link /opt:ref /opt:noicf
指定 /OPT:ICF 不啟動 /OPT:REF 選項。
ICF[= iterations**] | NOICF**
使用 /OPT:ICF[=iterations],以執行完全相同的 COMDAT 摺疊。多餘的 COMDAT 可以從連結器輸出中移除。iteration 指定符號要周遊複製的次數。預設反覆運算的次數為二。其他反覆運算可能會找出更多經由先前反覆運算中摺疊所揭露的複製。請注意,當 ICF 按預設啟用而且明確指定 /OPT:REF 時,以及當您明確地指定 /OPT:REF,ICF 時,連結器行為是有差異的。預設 ICF 加上 /OPT:REF 不會摺疊唯讀資料。這包括任何 .rdata、.pdata 和 .xdata。不過,預設的 ICF 搭配 /OPT:REF 會在產生 Itanium 和 x64 的映像時,造成較少的函式摺疊,因為這些模組內的函式擁有更多唯讀資料 (例如 .pdata 和 .xdata) 的相依性。若要取得完整的 ICF,請明確指定 /OPT:ICF。
函式是以 /Gy 編譯器選項置於 COMDAT 中,而 const 資料也是置於 COMDAT 中。如需有關如何指定資料以供摺疊的範例,請參閱 selectany。
如果 REF 為開啟,而且必須明確地在偵錯組建中加以開啟,ICF 就會預設為開啟。如果指定了 REF,也可能會指定 NOICF。
注意事項: /OPT:ICF 可能會造成將相同的位址指派給不同的函式或唯讀資料成員 (以 /Gy 編譯的 const 變數)。因此,/OPT:ICF 可能會中斷依賴函式或唯讀資料成員之位址不同的程式。如需詳細資訊,請參閱 /Gy (啟用函式階層連結)。
WIN98 | NOWIN98
WIN98 和 NOWIN98 會控制最終映像中的區段對齊。對於 Windows 98 應用程式,最好是將區段對齊 4K 界限以改善載入時間 (可以讓 Windows 98 記憶體管理員以浪費空間最少的方式快取可執行檔映像)。這在連結器中是預設為開啟,所以您必須指定 /OPT:NOWIN98,才能取得刪減版應用程式 (但是在 Windows 98 上會比較慢)。WIN98 是預設為開啟,但在下列各情況時,則 WIN98 預設為關閉:
使用 /ALIGN。
/MACHINE 並非針對 x86。
/SUBSYSTEM 指定了 WINDOWS 或 CONSOLE 以外的項目。
對於會成長 25% 以上 (依據下面的平均成長公式計算) 的映像,/OPT:WIN98 預設為不啟用。換句話說,較小的映像不會啟用 /OPT:WIN98。若要確保不受這項調整的影響,應該明確地啟用 /OPT:WIN98。請指定 /OPT:NOWIN98,以取得較小版本 (但是在 Windows 98 上也較慢) 的應用程式。
只有在可移植的可執行檔映像中的區段是開始於某頁的界限上的時候,Windows 98 中的增強功能才能夠運作。/OPT:WIN98 選項會執行必要的檔案對齊。
如果要建置只在 Windows NT 或 Windows 2000 上執行的元件,應該使用 /OPT:NOWIN98。
這項變更不會影響映像的載入或處理序的工作集 (Working Set)。唯一會影響的是在磁碟上的大小。
下列公式可以協助您計算使用 /OPT:WIN98 之映像的平均成長:
對於 4096 位元組檔案對齊的平均浪費空間可以由下列算式描述:映像中區段總數 * 4096/2
對於現有 512 位元組檔案對齊的平均浪費空間為:映像中區段總數 * 512/2
因此,成長為:
成長的位元組總數 = 映像中區段總數 * (4096/2 - 512/2)
或者,再簡化為
成長的位元組總數 = 映像中區段總數 * 1792
但是,這並沒有考量映像標頭必須要填補至區段對齊的問題。因為標頭必定小於 512 位元組,所以額外的成長應該是個常數 4096 - 512,也就是 3584。
平均成長的位元組總數 = 映像中區段總數 * 1792 + 3584
最大成長的位元組總數 = 映像中區段總數 * (4096 - 512 + 3584)
若要取得區段總數,請在可執行檔上使用 DUMPBIN 工具。摘要會列出該映像中區段的清單。您通常會看到 3 至 5 個區段加入到這項值。
唯一不可使用 /OPT:WIN98 的時機是:可移植之可執行檔映像非常小的時候。即使映像檔已預定要供下載,浪費的空間也會以零填補並且緊壓縮。
備註
最佳化通常會減小映像的大小及增加程式的速度,不過也會增加連結的時間。
您可以使用 /VERBOSE 選項,查看由 /OPT:REF 移除的函式,以及由 /OPT:ICF 摺疊的函式。
在 Visual Studio 開發環境中設定這個連結器選項
開啟專案的 [屬性頁] 對話方塊。如需詳細資訊,請參閱設定 Visual C++ 專案屬性。
按一下 [連結器] 資料夾。
按一下 [最佳化] 屬性頁。
修改下列其中一項屬性:
啟用 COMDAT 摺疊
最佳化 Windows 98
參考