【发布时间】:2021-07-04 09:06:12
【问题描述】:
C++ standard 说:
6.9.2.1。如果其中一个修改了内存位置 (6.6.1) 而另一个读取或修改了相同的内存位置,则两个表达式求值会发生冲突。
但是什么算作“修改内存位置”?标准在这句话前只提到了12次“修改”,没有一个是相关的。
例如,
int x = 0;
do_something(&x);
x = 0; // (*)
假设x 在do_something 之后仍然为零,那么(*) 行是否修改x?
【问题讨论】:
-
任何写入都是“修改”,即使值不变。
-
您可能引用了较旧的 C++ 标准,请参阅 Working Draft, Standard for Programming Language C++ 该部分似乎不再是 6。
-
@HolyBlackCat 谢谢。它是在标准中明确声明的,还是只是常识?
-
它仍然存在(注意 - 问题中的引用和标准都指线程数据竞赛)6.9.2.2 Data races
-
不确定标准是否明确表示,我认为这是常识。
标签: c++ language-lawyer memory-model