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
'Programing' 카테고리의 다른 글
Android에서 활동 스택보기 (0) | 2020.11.05 |
---|---|
#ifdef inside #define (0) | 2020.11.05 |
MongoDB에 이름 컬렉션에 대한 규칙이 있습니까? (0) | 2020.11.05 |
내 pidfile이 / var / run에 있어야합니까? (0) | 2020.11.05 |
Node.js "필수"함수 및 매개 변수 (0) | 2020.11.05 |