【发布时间】:2011-10-15 01:17:48
【问题描述】:
在这个例子中,正确性是否需要将global_value 声明为volatile?
int global_value = 0;
void foo () {
++ global_value;
}
void bar () {
some_function (++global_value);
foo ();
some_function (++global_value);
}
我的理解是,volatile 是“用于”pointers to mapped memory and variables which can be modified by signals(并且强调 不是 用于线程安全),但很容易想象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 经常被忽视。这将是nothing new!
扩展示例
void baz (int* i) {
some_function (++*i);
foo ();
some_function (++*i);
}
int main () {
baz (&global_value);
}
即使bar 保证编译成正确的 dont-cache-global_value 实现,baz 是否同样正确,或者是否允许缓存*i 的非易失性值?
【问题讨论】:
-
volatile的确切语义是依赖于实现的 -
baz与 volatile 无关,这是编译器知道的标准别名问题。因此,C99 有restrict。避免这些问题的最佳方法是根本不使用全局变量! -
不限于全局变量,类成员可以通过其他成员或朋友在同一个 mannar 中进行非局部修改。我想解决方案是“偏执狂或整个程序优化”然后......
标签: c++ c global-variables volatile qualifiers