割り算 VS 右シフト その3
この記事は割り算 VS 右シフト その2の続きです。
実行環境、検証方法などは、割り算 VS 右シフトを参照してください。
割り算 vs 右シフト(割る2 最適化)
次に、最適化オプションをつけてコンパイルした場合、割り算と右シフトは実行速度に差が出るのかを調べることにした。
そこで、2種類のC言語ソースに-O1 -Sオプションをつけてコンパイルし、アセンブラソースを表示させた。2種類のC言語プログラムのアセンブラソースは全く同じになった。入手したアセンブラソースの一部は以下の通り。
1 .file "div2.c" 2 .section .rodata.str1.1,"aMS",@progbits,1 3 .LC0: 4 .string "%d\n" 5 .text 6 .globl main 7 .type main, @function 8 main: ・・・ 16 movl $512, 4(%esp) 17 movl $.LC0, (%esp) ・・・ 27 .section .note.GNU-stack,"",@progbits
16行目を見ると、val / 2を行った結果を直接スタック領域に格納していることが分かる。つまりgccはコンパイル時に変数val / 2を計算してしまっているということである。なお、-O2, -O3オプションをつけて試してみたが、2種類のアセンブラソースに差異はなく、いずれもval / 2を行った結果を直接スタック領域に格納していることが分かった。
割り算 vs 右シフト(割る2 最適化)の結果
リテラルを対象とする場合は、実行速度は変わらない。