3

カーギルウィジェットの例を解決するためのJonKalbの強力な例外安全コードを考えると、コンパイラが操作を再編成してコードを強力に例外安全ではないようにするのを妨げるものは何ですか?

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

それは「コンパイラは観察可能な振る舞いを変更できない」というルールですか?

参照:

4

2 に答える 2

2

あなたはそれを自分で言いました:コンパイラは観察可能な振る舞いを変更するかもしれないことは何もできません。そして、起こりうる例外を考慮に入れることが義務付けられています。潜在的に、これによる並べ替えの制限は、最適化に重大な悪影響を与える可能性があります。実際には、考慮すべき2つのケースがあります。コンパイラは呼び出されている関数で何が起こっているのかわからないため、関数間で並べ替えることができません。または、コンパイラには、変換ユニット間で最適化する機能があります。この場合、通常、関数がスローしないことを判別できるため(スローしないと仮定して)、例外を無視した場合とまったく同じように並べ替えることができます。または、例外をスローすると、観察可能な動作が変更される可能性がある場合は、並べ替えないでください。

于 2013-03-21T17:56:01.273 に答える
1

最適化では、コードの証明可能なプロパティを保持する必要があります。そうしないと、コードを何もせず、最大限に高速なプログラムに置き換えることができます。例外の影響は、証明可能なプロパティの一部です。

于 2013-03-21T17:57:00.677 に答える