Подтвердить что ты не робот

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

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

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

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

Но, в частности, на мой взгляд: следующее выражение в разделе "Замечания":

В общем случае укажите /O2 (Максимизировать скорость) вместо /Ox.

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

4b9b3361

Ответ 1

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

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

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

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

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

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

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

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

Ответ 2

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

Ox и O2 почти одинаковы. Oни отличаются только тем, что O2 также throws GF и Gy. Почти нет причина не бросать эти два переключатели.