0

コードの断片は次のとおりです。

bool EqualsA(const Foo& a, const Foo& b)
{
    return a == b;
}

bool EqualsB(const Foo& a, const Foo& b)
{
    const bool result = a == b;

    return result;
}

int MethodA()
{
    return GetValue() * GetOtherValue();
}

int MethodB()
{
    const int result = GetValue() * GetOtherValue();

    return result;
}

これらの2つの異なる方法で値を返すことに違いがあるかどうかを知りたいと思いました(インスタントリターンまたは結果を変数に格納します)。デバッグには保存の方が良いと思いますが、パフォーマンスの低下(私はそうは思わない)や、それらの1つを使用することによるその他の長所と短所はありますか。

4

3 に答える 3

4

コンパイラーはローカル変数を自由に最適化できるため、パフォーマンスは同じになります。

多くのコード分析ツールでは、これはコードの臭いとしてマークされており、私は同意する傾向があります。ローカル変数が何も購入しないように、デバッガーでスタックの戻り値を確認することができます。

于 2013-02-25T23:02:54.550 に答える
3

operator ==タイプのオブジェクトの選択されたオーバーロードによって返される値がタイプFooであるという合理的な仮定の下で、適切boolなコンパイラは、重い最適化オプションが使用されるときに一時ストアを最適化するので、パフォーマンスに関しては重要ではありません

私のアドバイスは、コードを読みやすくしたり、保守やデバッグに便利な形式を選択することです。

于 2013-02-25T23:02:43.120 に答える
1

ほぼ間違いなく違いはありません。コンパイラは、プログラムが記述したとおりに動作する限り、コードに対して好きなことを行うことができます。したがって、優れたコンパイラは無意味な初期化を取り除きます。

ただし、この初期化を消せない状況が発生する可能性があります。たとえば、にoperator*使用されるオーバーロードが参照GetValue() * GetOtherValue()によってクラスタイプの結果を返す場合、constそのクラスタイプのコンストラクターにはいくつかの副作用がある可能性があります。含まれている場合、コンパイラは、プログラムの監視可能な動作を変更するため、初期化を取り除くことができません。

operator*しかし、値で返される場合、なぜそうではないのでしょうか?そうすれば、これはコピーの省略の候補になり、コンパイラーは、副作用があるかどうかに関係なく、構造を取り除くことができます。

于 2013-02-25T23:02:23.150 に答える