We wczesnych dniach gcc (2.8 itd.) Oraz w czasach egcs i redhat 2.96-O3 bywał czasem dość błędny. Ale to już ponad dziesięć lat temu, a -O3 niewiele różni się od innych poziomów optymalizacji (w buggyness).
Zwykle jednak ujawnia przypadki, w których ludzie polegają na nieokreślonym zachowaniu, z powodu bardziej ścisłego polegania na regułach, a zwłaszcza narożnych przypadkach języka (języków).
Osobiście, od wielu lat prowadzę oprogramowanie produkcyjne w sektorze finansowym z opcją -O3 i nie spotkałem się jeszcze z błędem, którego nie byłoby, gdybym użył opcji -O2.
Według popularnego popytu, tutaj dodatek:
-O3, a zwłaszcza dodatkowe flagi, takie jak -funroll-loop (nie włączone przez -O3) mogą czasami prowadzić do generowania większej liczby kodów maszynowych. W pewnych okolicznościach (np. Na jednostce centralnej z wyjątkowo małą pamięcią podręczną instrukcji L1) może to spowodować spowolnienie z powodu całego kodu np. Jakiejś wewnętrznej pętli, która nie pasuje już do L1I. Zasadniczo gcc bardzo mocno stara się nie generować tak dużej ilości kodu, ale ponieważ zazwyczaj optymalizuje ogólny przypadek, może się to zdarzyć. Opcje szczególnie na to podatne (jak rozwijanie pętli) zwykle nie są zawarte w -O3 i są odpowiednio oznaczone na stronie podręcznika. W związku z tym ogólnie dobrym pomysłem jest użycie opcji -O3 do generowania szybkiego kodu i polegać tylko na opcji -O2 lub -Os (która próbuje zoptymalizować rozmiar kodu), gdy jest to właściwe (np. Gdy profiler wskazuje brak L1I).
Jeśli chcesz maksymalnie wykorzystać optymalizację, możesz dostosować gcc za pomocą --param kosztów związanych z niektórymi optymalizacjami. Dodatkowo zauważ, że gcc ma teraz możliwość umieszczania atrybutów w funkcjach, które kontrolują ustawienia optymalizacji tylko dla tych funkcji, więc gdy okaże się, że masz problem z -O3 w jednej funkcji (lub chcesz wypróbować specjalne flagi dla tej funkcji), nie musisz kompilować całego pliku ani nawet całego projektu za pomocą O2.
otoh wydaje się, że należy zachować ostrożność podczas używania opcji -Ofast, która stwierdza:
-Ofast włącza wszystkie optymalizacje -O3. Umożliwia także optymalizacje, które nie są prawidłowe dla wszystkich standardowych programów zgodnych.
co prowadzi mnie do wniosku, że -O3 ma być w pełni zgodny ze standardami.