这对编译器优化是否安全?

时间:2018-06-10 11:36:24

标签: c++ recursion optimization

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

示例背后的想法是用户派生类中的用户'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;
}

1 个答案:

答案 0 :(得分:2)

您找到的标准:

  

<强> intro.execution.16

     

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

因此,您的计划无法优化&#39;。但正如评论中所述,您可能仍然遇到异常或并发问题。