考虑以下代码:
void f(int volatile *pTarget)
{
// ... code 1 ...
*pTarget = ...; // spotlight
// ... code 2 ...
// non-trivial infinite loop
// ... code 3 ...
}
据我所知volatile
访问不会阻止以任何方式重新排序指令。但是我的聚光灯可以推迟多久?可以推迟到代码3,因此实际上从未发生过吗?
答案 0 :(得分:2)
可以推迟使用易失性访问,直到它被使用,或者直到编译器不能再对代码进行推理,但它必须在某个时刻发生。当编译器可以证明其他代码时,可以对其他代码重新排序易失性访问。没有副作用,但不能对可能的副作用代码重新排序,包括另一个易失性访问。
只要执行路径保持在同一个翻译单元内,编译器通常就可以对代码进行推理。
答案 1 :(得分:1)
没有上限。您可能需要std::atomic
。