이 플래그는 makefile에 많이 있습니다. 그것은 무엇을 의미하며 언제 사용해야합니까?gcc -O2의 의미
답변
GCC의 man 페이지에서 최적화 레벨 2
:
-O1 최적화. 컴파일을 최적화하는 데는 다소 시간이 걸리고 많은 기능을 위해서는 더 많은 메모리가 필요합니다.
-O2 더욱 최적화하십시오. GCC는 의 절충을 포함하지 않는 거의 모든 지원 된 최적화를 수행합니다. 컴파일러에서 -O2를 지정할 때 루프 언 롤링을 수행하거나 함수 을 인라인하지 않습니다. -O와 비교하면 이므로이 옵션을 사용하면 컴파일 시간과 생성 된 코드의 성능이 모두 이되어 이 증가합니다.
-O3 더욱 최적화하십시오. -O3은 -O2로 지정된 모든 최적화를 켜고 은 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload 및 -ftree-vectorize 옵션을 켭니다.
-O0 컴파일 시간을 줄이고 디버깅 결과를 결과로 만듭니다. 이것이 기본값입니다.
-Os 크기를 최적화하십시오. -O는 일반적으로 코드 크기를 늘리지 않는 모든 -O2 최적화를 가능하게합니다. 또한 은 코드 크기를 줄이기 위해 추가 최적화를 수행합니다.
이것은 최적화 스위치입니다. gcc --help를 참조하십시오. 전 -O3
가 과도하게 코드를 "최적화"에 의해 몇 가지 결함을 일으킬 수 몇 년 즉, http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
참고 :
최적화 레벨 2는 최대 3. 참조입니다. AFAIK, 그것은 현대 버전의 GCC에서는 더 이상 사실이 아닙니다. 그러나 관성의 경우 -O2
은 "최대 안전"으로 간주됩니다.
컴파일러는 루프 풀기, CPU 파이프 라인 최적화와 같은 다양한 최적화 기술을 사용하여 쓸모없는 코드를 찾고 데이터 위험을 피함으로써 코드 속도를 높일 수 있습니다. 예를 들어 고정 된 시간 동안 발생하는 루프는 루프 제어 오버 헤드없이 인접한 코드로 변환됩니다. 또는 모든 루프 반복이 독립적 인 경우 일부 코드 병렬화가 가능합니다.
최적화 수준을 2로 설정하면 컴파일러에서 이러한 최적화를 찾는 데 소요되는 에너지 양을 알 수 있습니다. http://en.wikipedia.org/wiki/Compiler_optimization
시도 맨 : 가능한 값은 컴파일러가 코드를 최적화하기 위해 무엇을 할 수 있는지에 대해 자세히 알아볼 수 1
3 범위?-02
더욱 최적화하십시오. GCC는 공간 속도를 고려하지 않은 거의 모든 지원을 수행합니다. -O2를 지정할 때 컴파일러는 루프 언 롤링 또는 함수 인라이닝을 수행하지 않습니다.-O와 비교할 때이 옵션은 컴파일 시간과 생성 된 코드의 성능을 모두 향상시킵니다.
인간의 말로 표현하면 가장 안전한 방법입니다. -O3은 때때로 골칫거리가 될 수있는 재구성을 만듭니다. 피사체는 상당히 깊습니다.
컴파일러의 목표는 컴파일 비용을 줄이고 디버깅이 예상 된 결과를 생성하도록하는 것입니다. 최적화를 켜면 컴파일러는 컴파일 시간을 희생하면서 성능 및/또는 코드 크기를 향상시키고 프로그램을 디버그 할 수 있습니다.
기본값은 최적화 해제입니다. 결과적으로 컴파일 시간이 가장 빠르지 만 컴파일러는 최적화를 전혀 시도하지 않으며 생성 된 프로그램은 최적화가 활성화 된 경우보다 훨씬 더 크고 속도가 느립니다. 최적화 수준을 제어하기 위해 gcc에 다양한 -O 스위치 (허용되는 형식은 -O0, -O1 -O2, -O3 및 -Os)가 있습니다.
-O0 최적화하지 않습니다. 최적화되지 않은 코드를 생성하지만 컴파일 시간이 가장 빠릅니다. 이것이 기본값입니다.
-O1 보통 최적화. 합리적으로 잘 최적화하지만 컴파일 시간을 현저하게 저하시키지 않습니다. 큰 기능을 위해서는 훨씬 더 많은 메모리가 필요합니다.
-O2 GCC는 공간 - 속도 절충을 포함하지 않는 거의 모든 지원되는 최적화를 수행합니다. 컴파일러는 루프 언 롤링 또는 함수 인라이닝을 수행 할 때 수행하지 않습니다.
-O3 -O2와 같은 전체 최적화입니다. 또한 단위 내에서보다 적극적인 자동 인라이닝을 사용하여 루프를 벡터화합니다. 또한 -finline-functions, -funswitch-loops, -fpredictive-commoning, -fgcse-after-reload 및 -ftree-vectorize 옵션을 켭니다.
-Os 크기를 최적화하십시오. -O는 일반적으로 코드 크기를 늘리지 않는 모든 -O2 최적화를 가능하게합니다. 또한 코드 크기를 줄이기 위해 추가 최적화를 수행합니다. 그는 GCC의 MAN 페이지에서 질문을하고 있기 때문에 그는을 downvoted되었습니다 http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
@cdonner :
는 다양한 최적화 수준과 세부 사항에 사용되는 플래그/옵션에 대한 자세한 내용은. 아마 의도적으로? –이 남자는 너무 많은 질문을 던져서 대답을 쉽게 얻을 수 있습니다. GCC에 대한 모든 Google 워드 프로세서? –
Brian에 완전히 동의합니다. 사람들은 그러한 질문을 게시하기 전에 사람과 구글을 시도해야합니다. – qrdl