サーチ…
前書き
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