/OPT (Optymalizacje)
Kontroluje optymalizacje, które LINK wykonuje podczas kompilacji.
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{LBR | NOLBR}
Argumenty
REF | NOREF
/OPT:REF eliminuje funkcje i dane, do których nigdy nie ma odwołań; /OPT:NOREF utrzymuje funkcje i dane, do których nigdy nie ma odwołań.Gdy /OFT:REF jest włączone, LINK usuwa opakowane funkcje i dane, do których nie ma odniesień.Obiekt zawiera opakowane funkcje i dane (COMDAT), jeśli został skompilowany przy użyciu opcji /Gy.Ta optymalizacja jest znana jako eliminacja przechodnia (lub tranzytywna) COMDAT.Domyślnie opcja /OPT:REF jest włączona w kompilacjach nieprzeznaczonych do debugowania.Aby zastąpić to ustawienie domyślne i zachować COMDAT bez odwołań w programie, określ /OPT:NOREF.Możesz użyć opcji /INCLUDE, aby zastąpić usunięcie określonego symbolu.
Gdy opcja /OPT:REF jest włączona, jawnie lub domyślnie, włączona jest ograniczona forma /OPT:ICF, która jedynie składa identyczne funkcje.Jeśli chcesz mieć /OPT:REF, ale nie /OPT:ICF, musisz określić albo /OPT:REF,NOICF, albo /OPT:NOICF.
Jeśli jest określona opcja /DEBUG, domyślną wartością /OPT jest NOREF, a wszystkie funkcje są zachowywane w obrazie.Aby zastąpić ustawienie domyślne i zoptymalizować kompilację przeznaczoną do debugowania, określ /OPT:REF.Ponieważ /OPT:REF pociąga za sobą /OPT:ICF, zalecamy również określenie /OPT:NOICF, aby zachować identyczne funkcje w kompilacjach przeznaczonych do debugowania.Dzięki temu można łatwiej odczytywać ślady stosu i ustawiać punkty przerwania w funkcjach, które w przeciwnym razie byłyby składane razem.Opcja /OPT:REF wyłącza łączenie przyrostowe.
Musisz wyraźnie oznaczyć dane const jako COMDAT; użyj __declspec(selectany).
Określanie /OPT:ICF nie włącza opcji /OPT:REF.
ICF[= iterations ] | NOICF
Użyj /OPT:ICF[=iterations], aby wykonać identyczne składanie COMDAT.Zbędne dane COMDAT mogą być usunięte z danych wyjściowych konsolidatora.Opcjonalny parametr iterations określa, ile razy przenosić symbole dla duplikatów.Domyślna liczba iteracji wynosi dwa.Dodatkowe iteracje mogą zlokalizować więcej duplikatów, które zostaną odkryte przez składanie w poprzedniej iteracji.Konsolidator zachowuje się inaczej, gdy określono /OPT:REF — i domyślnie działa ICF — niż gdy /OPT:REF,ICF określono jawnie.Forma ICF, która jest włączona z samą opcją /OPT:REF, nie składa danych tylko do odczytu — to obejmuje .rdata, .pdata i .xdata.Dlatego jest składanych mniej funkcji, gdy obrazy są tworzone dla x64, ponieważ funkcje w tych modułach w większym stopniu zależą od danych tylko do odczytu — na przykład, .pdata i .xdata.Aby uzyskać pełne zachowanie składania ICF, jawnie określ /OPT:ICF.
Aby umieścić funkcje w COMDAT, należy użyć opcji kompilatora /Gy; aby umieścić dane const, trzeba je zadeklarować __declspec(selectany).Aby uzyskać informacje dotyczące sposobu określania danych do składania, zobacz selectany.
Domyślnie funkcja ICF jest włączona, jeśli funkcja REF jest włączona.Aby zastąpić to ustawienie domyślne, jeśli określono REF, użyj NOICF.Jeśli /OPT:REF nie zostało określone w kompilacji przeznaczonej do debugowania, musisz jawnie określić /OPT:ICF, aby umożliwić składanie COMDAT.Jednakże ponieważ /OPT:ICF może scalić identyczne dane lub funkcje, może zmienić nazwy funkcji, które pojawiają się w śladach stosu.Może również uniemożliwić ustawienie punktów przerwania w pewnych funkcjach lub zbadanie niektórych danych w debugerze, a także przenieść cię do nieoczekiwanych funkcji podczas przechodzenia przez kod w jednym kroku.Dlatego nie jest zalecane używanie /OPT:ICF w kompilacjach przeznaczonych do debugowania, chyba że korzyści wynikające z mniejszego kodu przewyższają niedogodności.
[!UWAGA]
Ponieważ /OPT:ICF może spowodować, że ten sam adres zostanie przypisany do różnych funkcji lub elementów członkowskich danych tylko do odczytu (zmiennych const tworzonych za pomocą /Gy), może przerwać program, który zależy od unikatowych adresów dla funkcji lub elementów członkowskich danych tylko do odczytu.Aby uzyskać więcej informacji, zobacz /Gy (Włączenie łączenia na poziomie funkcji).
LBR | NOLBR
Opcje /OPT:LBR i /OPT:NOLBR dotyczą tylko plików binarnych ARM.Ponieważ pewne instrukcje gałęzi procesora ARM mają ograniczony zasięg, jeśli konsolidator wykryje skok do adresu spoza zakresu, zastępuje adres docelowy instrukcji gałęzi adresem kodu „wyspy”, który zawiera instrukcję gałęzi, która odnosi się do faktycznego adresu docelowego.Możesz użyć /OPT:LBR, aby zoptymalizować wykrywanie instrukcji długich gałęzi i położenie pośrednich wysp kodu, aby zminimalizować całkowity rozmiar kodu./OPT:NOLBR powoduje, że konsolidator generuje wyspy kodu dla instrukcji długich gałęzi po ich napotkaniu, bez optymalizacji.Domyślnie ustawiono opcję /OPT:LBR, gdy łączenie przyrostowe nie jest włączone.Jeśli chcesz nieprzyrostowego łącza, ale nie chcesz optymalizacji długich gałęzi, określ opcję /OPT:NOLBR.Opcja /OPT:LBR wyłącza łączenie przyrostowe.
Uwagi
Optymalizacje ogólnie zmniejszają rozmiar obrazu i zwiększają szybkość programu kosztem zwiększonego czasu łączenia.
Możesz użyć opcji /VERBOSE, aby zobaczyć funkcje, które są usuwane przez /OPT:REF, oraz funkcje, które są składane przez /OPT:ICF.
Aby ustawić opcję OPT:ICF lub OPT:REF konsolidatora w środowisku programowania Visual Studio
Otwórz okno dialogowe projektu Strony właściwości.Szczegółowe informacje – zobacz: Praca z właściwościami projektu.
W lewym okienku rozwiń węzeł Właściwości konfiguracji, Konsolidator, Optymalizacja.
Zmodyfikuj jedną z tych właściwości:
Włącz zwijanie COMDAT
Odwołania
Aby ustawić opcję konsolidatora OPT:LBR w środowisku programowania Visual Studio
Otwórz okno dialogowe projektu Strony właściwości.Aby uzyskać szczegółowe informacje, zobacz Konfigurowanie właściwości projektu Visual C++.
Wybierz folder Konsolidator.
Wybierz stronę właściwości Wiersz polecenia.
Wpisz opcję w polu Dodatkowe opcje:
/opt:lbr
Aby programowo ustawić tę opcję konsolidatora
- Zobacz właściwości EnableCOMDATFolding i OptimizeReferences.