Следует ли ВСЕ глобальные переменные квалифицировать как изменчивые?

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

11
задан spraff 29 July 2011 в 15:13
поделиться