C++:代码重新排序距离是否有上限?

C++: Is there an upper limit for code reordering distance?

考虑这段代码:

void f(int volatile *pTarget)
{
    // ... code 1 ...
    *pTarget = ...; // spotlight
    // ... code 2 ...
    // non-trivial infinite loop
    // ... code 3 ...
}

据我所知volatile访问不会以任何方式阻止指令的重新排序。但是我的 spotlight 能推迟多久呢?它是否可以推迟到代码 3,从而实际上永远不会发生?

没有上限。你可能想要 std::atomic.

可以推迟易失性访问,直到它被使用,或者直到编译器无法再对代码进行推理,但它必须在某个时候发生。当编译器可以证明 'other code' 没有副作用时,可以针对其他代码重新排序易失性访问,但不能针对可能的副作用代码重新排序,包括另一个易失性访问。

通常只要执行路径保持在同一个翻译单元内,编译器就可以对代码进行推理。