/ OX 및 / O2 컴파일러 옵션의 차이점은 무엇입니까?
-
16-11-2019 - |
문제
Microsoft의 C ++ 컴파일러 (Visual Studio와 함께 포함 된 cl.exe
)는 여러 개의 최적화 스위치를 제공합니다. . 그들의 대부분의 차이점은 자명 해지는 것처럼 보이지만, 차이가 /O2
(최대 속도의 코드를 최적화)와 /Ox
(완전한 최적화 "를 선택하는 것") 사이의 차이점은 분명하지 않습니다.
/Ox
옵션의 문서를 읽으려고했습니다. 그리고이 스위치가 크기가 아닌 최대 속도에 대한 최적화를 가능하게하는지 확인하는 것으로 보입니다.
/Ox
컴파일러 옵션은 소형 크기로 실행 속도를 부여하는 코드를 생성합니다.그러나 특히 "비고"섹션 아래의 다음 진술은 내 눈을 잡았습니다 :
일반적으로
/O2
대신/Ox
(속도 극대화)를 지정하십시오.그래서 제 질문은 이유는 일반적으로
/O2
를 통해 일반적으로/Ox
를 선호해야합니까? 후자 옵션은 예상치 못한 버그 또는 기타 예기치 않은 행동을 일으키는 것으로 알려진 특정 최적화를 가능하게합니까? 얻은 최적화의 양은 추가 컴파일 시간에 가치가 없습니까? 아니면/O2
가 Vs의 기본값 옵션이라는 사실로 인해 완전히 무의미한 "권장 사항"입니다.
해결책
Asha's answer cites a blog post about Visual Studio 2005, and is rather out of date.
The latest version of the documentation is available here:
/Ox
: https://msdn.microsoft.com/en-us/library/59a3b321.aspx/O2
: https://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx
According to those:
/Ox
→/Og /Oi /Ot /Oy /Ob2
/O2
→ the same, but further adds/Gs /GF /Gy
/GF
eliminates duplicate strings/Gy
does function level linking
You may additionally be interested in /GS-
which turns off security checks around the stack, which can be a significant performance hit (see the MS docs for /GS).
You should benchmark your specific application, as ever.