May C ++编译器将以下循环优化为无限循环
this->m_stop=0;
while(!this->m_stop)
{
// do stuff
}
这个问题即使在单线程上下文中也是相关的,因为循环内的调用可能会间接影响状态标志。
答案 0 :(得分:1)
编译器只能执行不影响格式良好的程序的可观察行为的优化。这通常称为 as-if 规则;程序必须表现为 - 如果它是由符合标准的某个抽象机器执行的,但是实现可能会改变执行的内容以使其运行更快,只要程序在同样的方式。
因此,编译器无法将代码优化为无限循环,除非它可以证明它不会影响程序的可观察行为。当然,如果你某处有未定义的行为,那么所有的赌注都会被取消。
答案 1 :(得分:1)
如果循环体不可能合法地改变m_stop
,那么这是允许的优化。
如果编译器无法在循环中看到函数的内容,那么它必须假设它们可以更改m_stop
。
如果指向m_stop
或*this
的指针或引用存储在循环体中运行的代码可访问的某处,则编译器必须进行更广泛的分析以确定它是否存在可以安全地假设m_stop
没有变化。如果它无法进行此分析,则必须假设m_stop
可能会在循环体改变可能引用m_stop
的任何内容时发生变化。
答案 2 :(得分:-1)
如果this->m_stop
是非易失性的,并且编译器可以知道this->m_stop
的值不会改变它的值(即条件总是为真)。
即使this->m_stop
易变,也许(在某些情况下)可能知道条件仍然存在。但是这种情况仍然意味着它必须仍然基本上通过循环每次迭代评估至少this->m_stop
(即使它知道结果将是0
)。通常编译器不会知道。
如果编译器以某种方式知道在每次循环开始时该值都为this->m_stop
,0
改变值的情况也是可能的。