5

だから私はSOや他の場所で、、右辺値、左辺値広告などについて読んでいstd::moveますstd::forward。しかし、私はそれを理解することができないことがわかりました。私は時々修正に取り掛かりますが、これまでC++にあったポインターや参照などの基本的なことは理解していると思います。それは私ですか、それともこれらのものは重くなりすぎていますか?

4

2 に答える 2

7

まだお読みでない場合は、元の提案を読むことをお勧めします。

C++ 言語に Move Semantics サポートを追加する提案

右辺値参照と移動セマンティクスで解決できる問題と、右辺値参照と移動セマンティクスを使用してこれらの問題を解決する方法を非常に明確に示しています。

標準化委員会の文書は、内容が濃くて理解しにくいことが多いですが、これは非常にわかりやすく、読む価値があります。最終的な C++0x 標準で指定されている右辺値参照と移動セマンティクス (それが発生した場合) は、このペーパーで提案されているものとは異なる場合がありますが、概念は同じです。

于 2010-11-12T02:17:16.037 に答える
1

あなたの質問は非常に一般的です。多分私はあなたを始めることができます:

  • std:move()関数を無視std::forward()して、最初に
  • RValue 参照の 1 つの側面は、一時的な値を保存することです。
    • Matrix z = a + b + c + d;C++03 コードでは、 (with Matrix a,b,c,d;)の一時をカウントします。
    • オーバーロードされたRValue Referencesoperator+で自分自身を実装します。Matrix
    • 一時的な数を大幅に減らすことができるはずです。

の単純な使用方法を確認したい場合std::move(): コンパイラーが戻り値のコピーを導入しないようにします。

  • --のようなコンテナ クラスImageを作成すると、コピーにコストがかかります。
  • movecopy-assignを実装することを忘れないでください
  • 次のように機能するファクトリ関数を発明します。

    画像 load_matching_size(const char *fn_small, const char *fn_big) {
       ペア<画像> ii = load_2_images(fn_small, fn_big);
       return ii.first.width() >= 64 ? ii.first: ii.second ;
    }
    
  • 一時的な数を数えることはできますか?returnには追加の 1 つとコピーが必要になることに注意してください。(この例は、戻り値の最適化(「RVO」) ができないように設計されています)

  • これが必要ないことがわかりますか?の画像はii、関数が返された直後に破棄されます。コンパイラは戻り値に使用できますか? (いいえ、できませんでした。RVO が 1 つしかない場合でも機能しますImage)。
  • moveを使用すると、それ以上returnは必要なくii、戻り値に使用できることをコンパイラに伝えることができます。したがって、返品にはcopy- c'torの代わりにmove-c'torを使用して、コストのかかるコピーを節約できます。
于 2010-11-14T16:21:05.200 に答える