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

时间:2016-02-25 14:43:55

标签: c++ volatile

考虑以下代码:

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

据我所知volatile访问不会阻止以任何方式重新排序指令。但是我的聚光灯可以推迟多久?可以推迟到代码3,因此实际上从未发生过吗?

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

没有上限。您可能需要std::atomic