volatileの影響をアセンブリで比較
volatileはコンパイラによる最適化を抑止する修飾子のことだった気がする。
volatileの有無により、アセンブリがどう違うのかを比較してみる。
(どうでもいいけど、アセンブラとアセンブリの違いがわからない。。。)
試してみた結果、volatile有りだと演算用のレジスタ(?)にコピーしてから、加算や比較処理を行うようになっている模様。細かいことはアセンブラが読めないのでわかりません。
[shin@cent6-5 volatile]$ cat loop.c int main() { int i; for(i=0; i<1000000000; i++){} } [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ cat loop_vol.c int main() { volatile int i; for(i=0; i<1000000000; i++){} } [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ diff loop.s loop_vol.s 1c1 < .file "loop.c" --- > .file "loop_vol.c" 16c16,18 < addl $1, -4(%rbp) --- > movl -4(%rbp), %eax > addl $1, %eax > movl %eax, -4(%rbp) 18c20,21 < cmpl $999999999, -4(%rbp) --- > movl -4(%rbp), %eax > cmpl $999999999, %eax [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ cat loop.s .file "loop.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) ★変数i(rbp)を0で初期化 jmp .L2 ★L2にジャンプ .L3: addl $1, -4(%rbp) ★変数i(rbp)に1を加算 .L2: cmpl $999999999, -4(%rbp) ★ループの条件判定 jle .L3 ★判定結果に基づきL3にジャンプ leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)" .section .note.GNU-stack,"",@progbits [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ [shin@cent6-5 volatile]$ cat loop_vol.s .file "loop_vol.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) jmp .L2 .L3: movl -4(%rbp), %eax ★別のレジスタにコピー addl $1, %eax movl %eax, -4(%rbp) ★元のレジスタに書き戻し .L2: movl -4(%rbp), %eax ★別のレジスタにコピー cmpl $999999999, %eax jle .L3 leave .cfi_def_cfa 7, 8 ret .cfi_endproc .LFE0: .size main, .-main .ident "GCC: (GNU) 4.4.7 20120313 (Red Hat 4.4.7-4)" .section .note.GNU-stack,"",@progbits [shin@cent6-5 volatile]$
参考にさせて頂いたサイト