В первые дни gcc (2.8 и т. Д.), А также во времена egcs и redhat 2.96-O3 иногда были довольно глючными. Но это более десяти лет назад, и -O3 мало чем отличается от других уровней оптимизации (в том, что касается ошибок).
Тем не менее, он, как правило, выявляет случаи, когда люди полагаются на неопределенное поведение, поскольку они более строго следуют правилам и особенно угловым случаям языка (ов).
Что касается меня, я уже много лет работаю с производственным программным обеспечением в финансовом секторе с -O3 и еще не столкнулся с ошибкой, которой бы не было, если бы я использовал -O2.
По многочисленным просьбам вот дополнение:
-O3 и особенно дополнительные флаги, такие как -funroll-loops (не включены -O3), могут иногда приводить к генерированию большего количества машинного кода. При определенных обстоятельствах (например, на процессоре с исключительно небольшим кешем команд L1) это может вызвать замедление из-за всего кода, например, некоторого внутреннего цикла, который больше не вписывается в L1I. Обычно gcc старается не генерировать так много кода, но так как он обычно оптимизирует общий случай, это может произойти. Опции, особенно склонные к этому (например, развертывание цикла), обычно не включаются в -O3 и соответственно отмечаются на странице руководства. Поэтому обычно рекомендуется использовать -O3 для генерации быстрого кода и использовать только -O2 или -Os (который пытается оптимизировать размер кода), когда это уместно (например, когда профилировщик указывает, что L1I отсутствует).
Если вы хотите довести оптимизацию до крайности, вы можете настроить gcc с помощью --param затрат, связанных с определенной оптимизацией. Кроме того, обратите внимание, что теперь у gcc есть возможность помещать атрибуты в функции, которые управляют настройками оптимизации только для этих функций, поэтому, когда вы обнаружите, что у вас есть проблема с -O3 в одной функции (или хотите попробовать специальные флаги только для этой функции), Вам не нужно компилировать весь файл или даже весь проект с O2.
Ото кажется, что следует соблюдать осторожность при использовании -Ofast, который гласит:
-Ofast включает все оптимизации -O3. Это также позволяет оптимизировать не все стандартные программы.
что заставляет меня заключить, что -O3 предназначен для полного соответствия стандартам.