この例では、正しさglobal_value
を宣言する必要がありvolatile
ますか?
int global_value = 0;
void foo () {
++ global_value;
}
void bar () {
some_function (++global_value);
foo ();
some_function (++global_value);
}
私の理解では、シグナルによって変更できる(そして特にスレッドセーフではないvolatile
)マップされたメモリと変数へのポインタを「意図」していますが、次のようにコンパイルされる可能性があることは容易に想像できます。bar
push EAX
mov EAX, global_value
inc EAX
push EAX
call some_function
call foo
inc EAX
push EAX
call some_function
mov global_value, EAX
pop EAX
これは明らかに正しくありませんがvolatile
、C抽象マシンによれば有効であると私は信じていません。私は間違っていますか、それとも有効ですか?
もしそうなら、それvolatile
は日常的に見過ごされているように私には思えます。これは新しいことではありません!
拡張例
void baz (int* i) {
some_function (++*i);
foo ();
some_function (++*i);
}
int main () {
baz (&global_value);
}
bar
正しいdont-cache-global_value実装にコンパイルされることが保証されている場合でも、baz
同様に正しくなりますか、それとも?の不揮発性値をキャッシュでき*i
ますか?