c – 所有全局变量是否易失性?
在这个例子中,正确性是否需要将global_value声明为volatile?
int global_value = 0; void foo () { ++ global_value; } void bar () { some_function (++global_value); foo (); some_function (++global_value); } 我的理解是,对于pointers to mapped memory and variables which can be modified by signals来说,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 这显然是不正确的,但即使没有挥发性,我认为根据C抽象机是有效的.我错了还是有效? 如果是这样,在我看来,波动是常常被忽视的.这将是nothing new! 扩展示例 void baz (int* i) { some_function (++*i); foo (); some_function (++*i); } int main () { baz (&global_value); } 即使bar被保证编译成一个正确的dont-cache-global_value实现,将会同样正确,还是允许缓存* i的非易失性值? 解决方法
不,在这里不需要volatile关键字.由于global_value在函数栏外可见,编译器不能假设如果调用另一个函数,则它将保持不变.
[更新2011-07-28]我发现一个很好的引文证明了这一切.它在ISO C99,5.1.2.3p2中,我太懒了,无法在这里复制.它说:
序列点包括: >调用函数之后,对参数进行评估(6.5.2.2). 你有你的证明 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |