В этом примере требуется ли для корректности 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
?