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

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

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

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

Но, в частности, мое внимание привлекло следующее утверждение в разделе «Примечания»:

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

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

64
задан meJustAndrew 13 October 2017 в 13:27
поделиться