首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是什么阻止编译器优化重新排序强异常安全的代码?

是什么阻止编译器优化重新排序强异常安全的代码?
EN

Stack Overflow用户
提问于 2013-03-21 17:23:49
回答 2查看 394关注 0票数 3

鉴于Jon的强异常安全代码来解决Cargill Widget示例,是什么阻止编译器重新组织操作从而使代码不具有强异常安全性?

代码语言:javascript
复制
#include <algorithm> // std::swap

template< typename T1, typename T2 >
class Cargill_Widget
{
public:
    Cargill_Widget& operator=( Cargill_Widget const& r_other )
    {
        using std::swap;

        T1 temp_t1( r_other.m_t1 ); // may throw
        T2 temp_t2( r_other.m_t2 ); // may throw
        /* The strong exception-safety line */
        swap( m_t1, temp_t1 ); // no throw
        swap( m_t2, temp_t2 ); // no throw

        return *this;
    }

private:
    T1 m_t1;
    T2 m_t2;
};

这是“编译器不能改变可观察的行为”规则吗?

参考资料:

  • Jon的“异常安全代码”演示幻灯片:http://www.exceptionsafecode.com/slides/esc.pdf
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-21 17:56:01

您自己说过:编译器不能做任何可能修改可观察行为的事情。它必须考虑到可能的例外情况。因此,对重新排序的限制可能会对优化产生重大的负面影响。实际上,有两种情况需要考虑:编译器不知道正在调用的函数中发生了什么,因此不能重新排序它们,或者编译器确实有能力优化交叉转换单元,在这种情况下,它通常能够确定函数不会抛出(假设它不会),因此重新排序就像它忽略了异常一样。或者不重新排序,如果抛出异常可能会导致可观察行为的更改(如果是这样的话)。

票数 2
EN

Stack Overflow用户

发布于 2013-03-21 17:57:00

任何优化都必须保留代码的可证明属性。否则,任何代码都可以替换为一个程序,它什么也不做,而且速度最快。异常的影响是可证明属性的一部分。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15554127

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档