优化成员变量访问

Optimizing member variable access

本文关键字:访问 变量 成员 优化      更新时间:2023-10-16

可以C++编译器将以下循环优化为无限循环

this->m_stop=0;
while(!this->m_stop)
    {
//  do stuff
    }

即使在单线程上下文中,此问题也是相关的,因为循环内的调用可能会间接影响状态标志。

如果循环的主体无法合法地更改m_stop,那么这是一个允许的优化。

如果编译器在循环中看不到函数的内容,则必须假定它们可以更改m_stop

如果指向m_stop*this的指针或引用存储在循环主体中运行的代码可访问的位置,则编译器必须进行更广泛的分析,以确定是否可以安全地假设m_stop不会更改。如果它不能进行此分析,那么它必须假设如果循环的主体更改任何可能引用m_stop的内容,m_stop可能会发生变化。

编译器只能执行不影响格式良好程序的可观察行为的优化。这通常称为假设规则;程序的行为必须像由某个抽象机器按照标准执行一样,但是只要程序以相同的方式运行,实现就可以更改有关执行的内容,使其运行得更快。

因此,编译器无法将代码优化为无限循环,除非它可以证明它不会影响程序的可观察行为。当然,如果你在某个地方有未定义的行为,那么所有的赌注都是错误的。

如果

this->m_stop是非易失性的,并且编译器可以知道this->m_stop的值不会改变它的值(即条件将始终为真(。

也许它可以(在某些情况下(知道即使this->m_stop不稳定,条件也会保持不变。但这种情况仍然意味着它仍然必须基本上评估循环中每次迭代的至少 this->m_stop(即使它知道结果将是0(。通常编译器不会知道这一点。

此外,如果编译器以某种方式知道该值将在循环的每个开始时0,则this->m_stop更改其值的情况也是可能的。