Programing

gcc에서 컴파일러 최적화를 비활성화하는 방법은 무엇입니까?

lottogame 2020. 11. 5. 07:38
반응형

gcc에서 컴파일러 최적화를 비활성화하는 방법은 무엇입니까?


어셈블리 언어를 배우려고합니다. .c파일 을 분해하는 방법을 검색하고 찾았 지만 프로그램의 최적화 된 버전을 생성한다고 생각합니다. 내 C 파일에 해당하는 정확한 어셈블리 코드를 볼 수있는 방법이 있습니까?


gcc 옵션 -O은 다양한 수준의 최적화를 가능하게합니다. 사용하여 -O0그들과 사용을 해제하는 -S어셈블리를 출력. -O3가장 높은 수준의 최적화입니다.

gcc 4.8부터 최적화 수준 -Og을 사용할 수 있습니다. 이는 디버깅을 방해하지 않는 최적화를 활성화하며 표준 편집-컴파일-디버그주기에 권장되는 기본값입니다.

어셈블리의 언어를 intel 또는 att로 변경하려면 -masm=intel또는을 사용하십시오 -masm=att.

을 사용하여 특정 최적화를 수동으로 활성화 할 수도 있습니다 -fname.

자세한 내용 gcc 매뉴얼 을 참조하십시오.


gcc의 경우 컴파일러에 전달 된 -O1 -O2 또는 -O3 옵션 을 생략 하거나 이미 옵션이 있는 경우 -O0 옵션을 추가하여 다시 끌 수 있습니다. 또한 디버거에서 c 소스와 분해 된 기계어 코드를 볼 수 있도록 디버그 -g 를 추가하는 데 도움이 될 수 있습니다 .

참조 : http://sourceware.org/gdb/onlinedocs/gdb/Optimized-Code.html


최적화를 비활성화하려면 -O0 (-[대문자 o] [zero]) 스위치를 사용하고 어셈블리 파일을 가져 오려면 -S를 사용합니다. 여기에 더 GCC 명령 줄 옵션을 참조하십시오.


복사 제거없이 테스트하고 생성자 / 연산자를 복사 / 이동하는 것을 보려면 "-fno-elide-constructors"를 추가하십시오.

최적화 (-O0)가 없어도 GCC 및 Clang은 여전히 ​​복사 제거를 수행하므로 경우에 따라 복사 / 이동 생성자를 건너 뛰는 효과가 있습니다. 복사 제거에 대한 자세한 내용은 이 질문참조하십시오 .

그러나 Clang 3.4에서는 3.5에서 수정 된 버그 (생성자를 호출하지 않는 잘못된 임시 개체)를 트리거합니다.


gcc 명령 줄에서 -O0을 전달하면 최적화를 비활성화 할 수 있습니다.

예를 들어 .C 파일을 .S 파일 호출로 바꾸려면 :

gcc -O0 -S test.c


오래 전이지만 여전히 필요했습니다.

info - https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
list - gcc -Q --help=optimizers test.c | grep enabled
disable as many as you like with:
  gcc **-fno-web** -Q --help=optimizers test.c | grep enabled

#pragma GCC push_options를 사용하여 내부적으로 최적화를 제어 할 수도 있습니다.

#pragma GCC push_options
/* #pragma GCC optimize ("unroll-loops") */     

.... code here .....

#pragma GCC pop_options

참고 URL : https://stackoverflow.com/questions/5765899/how-to-disable-compiler-optimizations-in-gcc

반응형