수색…
소개
GNU 컴파일러는 컴파일 프로세스에 대해 다양한 수준의 최적화를 제공합니다. 이러한 최적화는 코드 성능 및 / 또는 코드 크기를 향상시키는 데 사용됩니다. 최적화가 설정된 코드를 컴파일하는 데 일반적으로 시간이 오래 걸립니다.
이 명령은 시스템에서 사용할 수있는 최적화가 무엇인지 알려줍니다 : $ gcc -Q --help = optimizations
다음은 최적화를 제어하는 옵션에 대한 자세한 문서입니다.
O0와 O3으로 컴파일 된 코드 간의 차이점
나는 간단한 C 코드 foo.c를 작성했다.
int main()
{
int i = 0;
int j = 0;
for (i = 0; i < 5; i++) {
j = i + 1;
}
return 0;
}
모든 컴파일러 최적화를 비활성화하여 -O0으로 컴파일하면
$ gcc -o foo.S foo.c -O0 -S
알았어:
.file "foo.c"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
movl $0, -4(%rbp)
movl $0, -8(%rbp)
movl $0, -4(%rbp)
jmp .L2
.L3:
movl -4(%rbp), %eax
addl $1, %eax
movl %eax, -8(%rbp)
addl $1, -4(%rbp)
.L2:
cmpl $4, -4(%rbp)
jle .L3
movl $0, %eax
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (GNU) 6.2.0"
.section .note.GNU-stack,"",@progbits
GCC는 내 코드를 어셈블리 언어로 변환하기 위해 모든 고통을 감수했다.
그러나 O3로 코드를 컴파일했을 때 (즉, 최고 수준의 최적화를 사용했을 때)
알았어:
.file "foo.c"
.section .text.startup,"ax",@progbits
.p2align 4,,15
.globl main
.type main, @function
main:
.LFB11:
.cfi_startproc
xorl %eax, %eax
ret
.cfi_endproc
.LFE11:
.size main, .-main
.ident "GCC: (GNU) 6.2.0"
.section .note.GNU-stack,"",@progbits
GCC는 변수와 루프에 대해 아무 것도하지 않고 그냥 무언가를하고 있다는 것을 이해했습니다. 그래서 코드가없는 빈 스텁을 남겼습니다.
DAYUM!
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow