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' 没有副作用时,可以针对其他代码重新排序易失性访问,但不能针对可能的副作用代码重新排序,包括另一个易失性访问。
通常只要执行路径保持在同一个翻译单元内,编译器就可以对代码进行推理。
考虑这段代码:
void f(int volatile *pTarget)
{
// ... code 1 ...
*pTarget = ...; // spotlight
// ... code 2 ...
// non-trivial infinite loop
// ... code 3 ...
}
据我所知volatile
访问不会以任何方式阻止指令的重新排序。但是我的 spotlight 能推迟多久呢?它是否可以推迟到代码 3,从而实际上永远不会发生?
没有上限。你可能想要 std::atomic
.
可以推迟易失性访问,直到它被使用,或者直到编译器无法再对代码进行推理,但它必须在某个时候发生。当编译器可以证明 'other code' 没有副作用时,可以针对其他代码重新排序易失性访问,但不能针对可能的副作用代码重新排序,包括另一个易失性访问。
通常只要执行路径保持在同一个翻译单元内,编译器就可以对代码进行推理。