В чем разница между параметрами компилятора /Ox и /O2?


компилятор Microsoft C++ (cl.exe, в комплекте с Visual Studio) предлагает несколько переключателей оптимизация. Разница между большинством из них кажется самоочевидной, но мне не ясно, в чем разница между /O2 (который оптимизирует код для максимальной скорости) и /Ox (который выбирает "полная оптимизация").

я пробовал читать документация на /Ox опция, и это, кажется, подтверждает, что этот переключатель также позволяет оптимизировать максимальную скорость, а не размер:

The /Ox параметр компилятора создает код, который способствует скорости выполнения по сравнению с меньшим размером.

но в частности, мне бросилось в глаза следующее утверждение в разделе "замечания":

в целом, указать /O2 (Максимальная скорость) вместо /Ox.

так что мой вопрос, зачем вообще пользу /O2 over /Ox? позволяет ли последний вариант конкретной оптимизации, которая, как известно, вызывает непредвиденные ошибки или другое неожиданное поведение? Это просто, что количество оптимизации, которая будет получена не стоит дополнительного времени компиляции? Или это просто совершенно бессмысленная "рекомендация", вытекающая из того, что /O2 это по умолчанию вариант в VS?

2 60

2 ответа:

Аша цитирует сообщение в блоге о Visual Studio 2005 и довольно устарело.

последняя версия документации доступна здесь:

согласно тем:

кажется,/O2 наборы /Gs без значения, которое подразумевает значение по умолчанию /Gs0. И из документов для что:

/Gs0 активирует зонды стека для каждого вызова функции, который требует хранение локальных переменных. Это может оказать негативное влияние на спектакль.

так /O2 вполне может быть медленнее, чем /Ox для вас, исключительно из-за этого. IMO это достаточно удивительно, чтобы выглядеть как ошибка (либо в документах, либо в реализации).

вы можете также быть заинтересованы в /GS- отключение проверки безопасности вокруг стека, который может быть значительным хитом производительности (см. MS docs for /GS).

вы должны проверить свое конкретное приложение, как всегда.

Я нашел его здесь:

Ох и О2 практически идентичны. Они отличаются только тем, что O2 тоже бросает GF и гы. Почти нет причина, чтобы не бросать эти два переключатели.