TVアニメ「となりの吸血鬼さん」PV第1弾
アニメ『となりの吸血鬼さん』
神アニメなんでしょうけど、そこまで夢中になって見てません。でも、見ると癒されます。
gcc -O3オプションの続きです。
もう一度、-O3オプションの説明を読んでみます。
-O3 さらなる最適化を行います。これは -O2 が行う全ての最適化手段に加
えて -finline-functions も有効にします。
-O2との差分としては、-finline-functionsのオプションがあるかないかってことですね。
インライン関数を有効にするってことでしょうか。
オプションの説明を見てみます。
-finline-functions
全ての単純な関数を呼び出し側に組み込んでしまいます。コンパイラは
ヒューリスティックスを用いて、 どの関数がこの方法で組み込むに足
りるほど単純かを決定します。
もし、ある関数に対する全ての呼び出しを組み込むことができ、かつそ
の関数が static と宣言されていた場合は、GCC はその関数を独立した
アセンブラコードと しては出力をしません。
なるほど。前回は関数が単純すぎたので、引数を使って戻り値も返してくれる関数に変更してみます。
takk@deb9:~/tmp$ cat -n t.c
1 int func1(int a)
2 {
3 return a + 50;
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
15 return func1(b);
16 }
takk@deb9:~/tmp$
これでどうでしょうか。アセンブラを確認します。
takk@deb9:~/tmp$ gcc -o t-O2.s -S -O2 t.c
takk@deb9:~/tmp$ cat -n t-O2.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 leal 50(%rdi), %eax
10 ret
11 .cfi_endproc
12 .LFE0:
13 .size func1, .-func1
14 .section .text.startup,"ax",@progbits
15 .p2align 4,,15
16 .globl main
17 .type main, @function
18 main:
19 .LFB1:
20 .cfi_startproc
21 movl $150, %eax
22 ret
23 .cfi_endproc
24 .LFE1:
25 .size main, .-main
26 .ident "GCC: (Debian 6.3.0-18+deb9u1) 6.3.0 20170516"
27 .section .note.GNU-stack,"",@progbits
takk@deb9:~/tmp$
一応func1はアセンブラコード上存在してますね。
では、-O2と-O3のアセンブラコードを比較してみます。
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$
-O2と-O3、変化なしです。
少し複雑だったのかもしれません。戻り値をなくして、もう少し単純な関数にしてみます。
takk@deb9:~/tmp$ cat -n t.c
1 void func1(int* a)
2 {
3 *a = *a + 50;
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
15 func1(&b);
16
17 return b;
18 }
takk@deb9:~/tmp$
比較します。
takk@deb9:~/tmp$ gcc -o t-O2.s -O2 -S t.c takk@deb9:~/tmp$ gcc -o t-O3.s -O3 -S t.c takk@deb9:~/tmp$ diff t-O2.s t-O3.s takk@deb9:~/tmp$
変化なしです。
関数をもっと単純にします。
takk@deb9:~/tmp$ cat -n t.c
1 int b;
2 void func1(void)
3 {
4 b = b + 50;
5 }
6
7 int main()
8 {
9 int a=10;
10 if(a == 10)
11 b = 100;
12 else
13 b = 200;
14
15 func1();
16
17 return b;
18 }
takk@deb9:~/tmp$
比較。
takk@deb9:~/tmp$ gcc -o t-O3.s -O3 -S t.c takk@deb9:~/tmp$ gcc -o t-O2.s -O2 -S t.c takk@deb9:~/tmp$ diff t-O2.s t-O3.s takk@deb9:~/tmp$
変化なしです。
おかしいですねえ。
つづく


コメント