수색…


소개

GNU 컴파일러는 컴파일 프로세스에 대해 다양한 수준의 최적화를 제공합니다. 이러한 최적화는 코드 성능 및 / 또는 코드 크기를 향상시키는 데 사용됩니다. 최적화가 설정된 코드를 컴파일하는 데 일반적으로 시간이 오래 걸립니다.

이 명령은 시스템에서 사용할 수있는 최적화가 무엇인지 알려줍니다 : $ gcc -Q --help = optimizations

다음은 최적화를 제어하는 ​​옵션에 대한 자세한 문서입니다.

https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

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