现在有点偏执被编译器优化所困扰,我想对以下代码的有效性发表意见。 基类是公共框架的一部分,但派生的内容将由所述框架的用户创建。
示例背后的想法是用户派生类中的用户'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;
}
答案 0 :(得分:2)
您找到的标准:
<强> intro.execution.16 强>
在每个值计算和与要评估的下一个完整表达式相关的副作用之前,对与全表达式相关的每个值计算和副作用进行排序。
因此,您的计划无法优化&#39;。但正如评论中所述,您可能仍然遇到异常或并发问题。