while(1){LOVE++;}を最適化
最近ツイッターで
"while(1){LOVE++}"と書き込まれてる指輪があって、
そのソースは最適化でLOVEが消えてただの無限ループになる云々という話があったので検証。
http://togetter.com/li/144840
用意したソースはこちら。
int main() { int LOVE = 0; while(1){LOVE++;} }
それじゃアセンブラを見てみましょ。
まずは最適化抜き。
.file "hoge.c" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp subl $16, %esp movl $0, -4(%ebp) ;LOVE=0 .L2: addl $1, -4(%ebp) ;LOVE++ jmp .L2 ;JUMP TO L2 .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5" .section .note.GNU-stack,"",@progbits
LOVEは残ってますね。
.file "hoge.c" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp .L2: jmp .L2 ;JUMP TO L2 .size main, .-main .ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5" .section .note.GNU-stack,"",@progbits
愛は最適化によって消滅しました。
追記
なんかvolatileで最適化抑制すんじゃねっつー話らしいです。
あーvolatileね。あーうん、あれね。あれでしょ。あれ。
知ってる知ってる。えーとね。あれでしょ。
マルチスレッド云々書いてると最適化されたら困る時があるらしくって、そーいうのにつかうんだそーです。
ここが詳しかった。
http://proger.blog10.fc2.com/blog-entry-20.html