右辺値参照で返すほうが効率的ですか? 質問する

右辺値参照で返すほうが効率的ですか? 質問する

例えば:

Beta_ab&& Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

ベストアンサー1

Beta_ab&&
Beta::toAB() const {
    return move(Beta_ab(1, 1));
}

これは、lvalue 参照の場合と同様に、ぶら下がり参照を返します。関数が戻った後、一時オブジェクトは破棄されます。Beta_ab次のように、値で返す必要があります。

Beta_ab
Beta::toAB() const {
    return Beta_ab(1, 1);
}

これで、一時オブジェクトが関数の戻り値に適切に移動されましたBeta_ab。コンパイラが可能な場合は、RVO (戻り値最適化) を使用して移動を完全に回避します。これで、次の操作を実行できます。

Beta_ab ab = others.toAB();

そして、一時的なものを に移動するabか、RVOを実行して移動やコピーをまったく行わないようにする。BoostCon09 右辺値参照 101これは問題を説明し、(N)RVO がこれとどのように相互作用するかを説明します。


右辺値参照を返すというあなたのケースは、他の場合にも良いアイデアでしょう。getAB()一時変数で頻繁に呼び出す関数があるとします。右辺値の一時変数に対して const 左辺値参照を返すようにするのは最適ではありません。次のように実装できます。

struct Beta {
  Beta_ab ab;
  Beta_ab const& getAB() const& { return ab; }
  Beta_ab && getAB() && { return move(ab); }
};

この場合は、ローカル自動値でも一時右辺値でもないmoveため、オプションではないことに注意してください。ab参照修飾子 &&2番目の関数は右辺値の一時変数に対して呼び出され、コピーの代わりに次の移動を行う。

Beta_ab ab = Beta().getAB();

おすすめ記事