【问题标题】:What prevents the compiler's optimization to reorder strongly exception-safe code?是什么阻止了编译器对强异常安全代码重新排序的优化?
【发布时间】:2013-03-21 17:23:49
【问题描述】:

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

#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;
};

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

参考:

【问题讨论】:

    标签: c++ compiler-optimization exception-safety


    【解决方案1】:

    你自己说过:编译器不能做任何事情 可能会修改可观察到的行为。它有义务采取 考虑到可能的例外情况。潜在地,限制 因此重新排序可能会产生很大的负面影响 对优化的影响。实际上,有两种情况 考虑:编译器不知道在 函数被调用,因此无法在它们之间重新排序,或者 编译器确实有能力进行优化 翻译单元,在这种情况下,它通常能够 确定该函数不会抛出(假设它不会),并且 因此重新排序就好像它忽略了异常一样。或不 重新排序,如果抛出异常可能会导致 如果确实如此,则可观察到的行为。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        相关资源
        最近更新 更多