TVアニメ『やがて君になる』 PV 第1弾
アニメ『やがて君になる』
いきなり好きというよりも、過程があるから感情移入できます。
今回は、gcc -O3オプションのアセンブラを見てみたいと思います。
-O3オプションは、manではこのように説明されています。
-O3 さらなる最適化を行います。これは -O2 が行う全ての最適化手段に加 えて -finline-functions も有効にします。
今回もこのソースです。
takk@deb9:~/tmp$ cat -n t.c 1 int main() 2 { 3 int a=10; 4 int b; 5 if(a == 10) 6 b = 100; 7 else 8 b = 200; 9 } takk@deb9:~/tmp$
-O2、-O3それぞれでビルドして、アセンブラの差分を見てみましょう。
takk@deb9:~/tmp$ gcc -o t-O2.s -S -O2 t.c takk@deb9:~/tmp$ gcc -o t-O3.s -S -O3 t.c takk@deb9:~/tmp$ diff t-O2.s t-O2.s takk@deb9:~/tmp$
おかしいです。差分がありません。
もしかしたらmainから呼び出す関数がないから差分がないのかもしれません。
空関数を入れてみます。
takk@deb9:~/tmp$ cat -n t.c 1 void func1() 2 { 3 4 } 5 6 int main() 7 { 8 int a=10; 9 int b; 10 if(a == 10) 11 b = 100; 12 else 13 b = 200; 14 } takk@deb9:~/tmp$
takk@deb9:~/tmp$ gcc -o t-O2.s -S -O2 t.c takk@deb9:~/tmp$ gcc -o t-O3.s -S -O3 t.c takk@deb9:~/tmp$ diff t-O2.s t-O3.s takk@deb9:~/tmp$
だめですねえ。
差分ありません。
アセンブラみてみます。
takk@deb9:~/tmp$ cat -n t-O3.s 1 .file "t.c" 2 .text 3 .p2align 4,,15 4 .globl func1 5 .type func1, @function 6 func1: 7 .LFB0: 8 .cfi_startproc 9 rep ret 10 .cfi_endproc 11 .LFE0: 12 .size func1, .-func1 13 .section .text.startup,"ax",@progbits 14 .p2align 4,,15 15 .globl main 16 .type main, @function 17 main: 18 .LFB1: 19 .cfi_startproc 20 xorl %eax, %eax 21 ret 22 .cfi_endproc 23 .LFE1: 24 .size main, .-main 25 .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516" 26 .section .note.GNU-stack,"",@progbits takk@deb9:~/tmp$
関数func1はコールされてないですね。func1を実行したところで何も変わらないので最適化されているんですね。
つづく
コメント