C 컴파일러가 루프를 실행하여 최적화 할 수 있습니까?
예를 들면 :
int num[] = {1, 2, 3, 4, 5}, i;
for(i = 0; i < sizeof(num)/sizeof(num[0]); i++) {
if(num[i] > 6) {
printf("Error in data\n");
exit(1);
}
}
프로그램이 실행될 때마다 이것을 실행하는 대신 컴파일러가 이것을 실행하고 최적화 할 수 있습니까?
한번 보시죠 ... (이것이 유일한 방법입니다.)
주먹, 나는 당신의 스 니펫을 우리가 실제로 컴파일하고 실행을 시도 할 수있는 것으로 변환하고 main.c
.
#include <stdio.h>
static int
f()
{
const int num[] = {1, 2, 3, 4, 5};
int i;
for (i = 0; i < sizeof(num) / sizeof(num[0]); i++)
{
if (num[i] > 6)
{
printf("Error in data\n");
return 1;
}
}
return 0;
}
int
main()
{
return f();
}
실행 gcc -S -O3 main.c
하면 다음 어셈블리 파일 ( main.s
)이 생성됩니다.
.file "main.c"
.section .text.unlikely,"ax",@progbits
.LCOLDB0:
.section .text.startup,"ax",@progbits
.LHOTB0:
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB22:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
.LFE22:
.size main, .-main
.section .text.unlikely
.LCOLDE0:
.section .text.startup
.LHOTE0:
.ident "GCC: (GNU) 5.1.0"
.section .note.GNU-stack,"",@progbits
어셈블리를 모르더라도 문자열 "Error in data\n"
이 파일에 존재 하지 않는다는 것을 알 수 있으므로 분명히 어떤 종류의 최적화가 수행되었을 것입니다.
main
함수에 대해 생성 된 기계 명령어를 자세히 살펴보면
xorl %eax, %eax
ret
우리는 EAX 레지스터를 XOR (항상 0이 됨)하고 그 값을 EAX에 쓰는 것임을 알 수 있습니다. 그런 다음 다시 돌아옵니다. EAX 레지스터는 반환 값을 유지하는 데 사용됩니다. 보시다시피이 f
기능은 완전히 최적화되었습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다