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
?