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