首页 > 解决方案 > 这对编译器优化安全吗?

问题描述

现在有点偏执于被编译器优化所吸引,我想对以下代码的有效性发表意见。基类是公共框架的一部分,但派生类将由所述框架的用户创建。

该示例背后的想法是,用户派生类中的用户“Process”函数可能会调用框架基础中的“ProcessMessage”,从而导致递归调用。如果发生了递归调用,则消息将排队等待稍后处理。

问题是,调用派生函数的两个“处理”标志对编译器优化是否安全?

//*************************************
// Framework code.
//*************************************
template <typename TDerived>
class Base
{
public:

  Base()
    : processing(false)
  {
  }

  void ProcessMessage(int msg)
  {
    if (processing)
    {
      // Queue the message for later.
    }
    else
    {
      processing = true; // Are these safe from optimisation?

      // Calls user derived class function
      static_cast<TDerived&>(*this).Process(msg);

      processing = false; // Are these safe from optimisation?
    }
  }

private:

  bool processing;
};

//*************************************
// User code.
//*************************************
class Derived : public Base<Derived>
{
public:

  void Process(int msg)
  {
    if ((msg % 4) == 0)
    {
      this->ProcessMessage(msg); // Recursive call.
    }
  }
};

int main()
{
  Derived derived;

  derived.ProcessMessage(0);
  derived.ProcessMessage(1);

  return 0;
}

标签: c++recursionoptimization

解决方案


您找到的标准:

intro.execution.16

与完整表达式关联的每个值计算和副作用在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。

因此,您的程序“不受优化”。但正如评论中所述,您可能仍然遇到异常或并发问题。


推荐阅读