c++ - 这对编译器优化安全吗?
问题描述
现在有点偏执于被编译器优化所吸引,我想对以下代码的有效性发表意见。基类是公共框架的一部分,但派生类将由所述框架的用户创建。
该示例背后的想法是,用户派生类中的用户“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;
}
解决方案
您找到的标准:
intro.execution.16
与完整表达式关联的每个值计算和副作用在与要评估的下一个完整表达式关联的每个值计算和副作用之前排序。
因此,您的程序“不受优化”。但正如评论中所述,您可能仍然遇到异常或并发问题。
推荐阅读
- c++ - 在 Visual Studio 2019 中查找或 LINQ C++
- visual-studio-code - 为什么 Node.JS 包必须用 Electron 编译才能在 VSCode 扩展开发中使用它们?
- tensorflow - 如何从 Google 存储桶加载 Tensorflow 冻结图模型?
- c# - 模拟“ASP.NET_SessionId”cookie
- amazon-web-services - 如何拆分 aws:username 策略变量以检查是否已授予写入权限?
- oracle - ORA-01654: 无法在表空间 SYSTEM 00604 中将索引 SYS.I_IDL_UB11 扩展 8。00000 -“递归 SQL 级别 %s 发生错误”
- java - 带有奇偶校验器的正负校验器
- prestashop - Prestashop 提交后返回页面 html
- plotly - 如何在绘图中不填充 NaN 下的区域
- oracle - 在 Oracle 包中填充 sysrefcursor out 参数