l1[]
とl2[]
はコンパイラの最適化中に削除されます。これは、両方が存在するためですlocal and unused variables
(両方の変数が他の場所で使用される可能性はありません)。
-S
アセンブリ コードを生成するオプションを使用 l1[]
してコードをコンパイルできますl2[]
。
入力ファイルは、アセンブリ ファイルを生成するx.c
コマンドでコンパイルされましたgcc -S x.c
x.s
main:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
movb $28, -4(%ebp)
movb $44, -3(%ebp)
movb $60, -2(%ebp)
movb $76, -1(%ebp)
leave
ret
.size main, .-main
.data
.type l2.1250, @object
.size l2.1250, 4
しかし、 の定義を見つけることができますg1[] and g2[]
。
.file "x.c"
.globl g1
.data
.type g1, @object
.size g1, 4
g1:
.byte 26
.byte 42
.byte 58
.byte 74
.type g2, @object
.size g2, 4
g2:
.byte 27
.byte 43
.byte 59
.byte 75
.text
.globl main
.type main, @function
さらに、フラグ-O3
最適化フラグ レベル 3を使用してコードをコンパイルすると、 の定義のみg1[]
が存在することを知っておくと興味深いでしょう。グローバル静的変数 (ファイルに対してプライベート) も削除されます。
入力ファイルは、アセンブリ ファイルを生成するx.c
コマンドでコンパイルされましたgcc -S -O3 x.c
x.s
下:
.file "x.c"
.text
.p2align 4,,15
.globl main
.type main, @function
main:
pushl %ebp
movl %esp, %ebp
popl %ebp
ret
.size main, .-main
.globl g1
.data
.type g1, @object
.size g1, 4
g1:
.byte 26
.byte 42
.byte 58
.byte 74
.ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5"
.section .note.GNU-stack,"",@progbits
g1[]
はグローバル データのみ存在し、g2[]
で削除され-O3
ます。
g2[]
use defined static unsigned char g2[]
so はこのファイル内でのみアクセスし、使用しないでください。ただしg1[]
、グローバルなので、他のファイルにこれが含まれていると、他のプログラムで役立つ場合があります。また、コンパイラはグローバル オブジェクトを最適化することはできません。
参照: 「未使用」のグローバル変数がコンパイルされないようにするにはどうすればよいですか?
つまり、これはすべてコンパイラの最適化によるものです。