サーチ…


前書き

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