允许C++编译器将下面的循环优化为无限循环
this->m_stop=0;
while(!this->m_stop)
{
// do stuff
}
即使在单线程上下文中,这个问题也是相关的,因为循环中的调用可能间接地影响状态标志。
发布于 2017-03-20 01:10:52
如果没有可能使循环的主体能够合法地更改m_stop
,那么这是一个允许的优化。
如果编译器不能在循环中看到函数的内容,那么它必须假定它们可以更改m_stop
。
如果指向m_stop
或*this
的指针或引用存储在运行在循环主体中的代码可访问的某个地方,那么编译器必须进行更广泛的分析,以确定假定m_stop
不发生更改是否安全。如果它不能进行此分析,则必须假定如果循环的主体更改了任何可能引用m_stop
的内容,则必须假定m_stop
可能发生更改。
发布于 2017-03-20 01:05:32
编译器只能执行不影响结构良好的程序的可观察行为的优化。这通常被称为as-if规则;如果程序是由符合标准的抽象机器执行的,则程序必须按照--执行的方式运行,但只要程序以相同的方式运行,实现可能会更改执行的内容,使其运行得更快。
因此,编译器无法将代码优化为无限循环,除非它能够证明它不影响程序的可观察行为。当然,如果你在某个地方有未定义的行为,那么所有的赌注都取消了。
发布于 2017-03-20 00:33:48
如果this->m_stop
是非易失性的,并且编译器可以知道this->m_stop
的值不会改变它的值(即条件始终为真)。
也许它可以(在某些情况下)知道,即使this->m_stop
是不稳定的,条件仍然是正确的。但是,这个场景仍然意味着它仍然必须对循环中的每个迭代至少计算至少this->m_stop
(即使它知道结果将是0
)。通常,编译器不会知道这一点。
此外,如果编译器能够知道在循环的每个开始时,this->m_stop
值都是0
值,那么修改它值的情况也是可能的。
https://stackoverflow.com/questions/42898876
复制相似问题