問題タブ [move-semantics]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 重いオブジェクトを渡すC++0x
ある種の高価なオブジェクト(固定サイズではないベクトルとマップを含む)を生成する関数があるので、コピーc'torを呼び出さないようにします。
これまで、メソッドからstd :: shared_ptrを返し、それを使用しましたが、これは醜く、typedeffingを実際に使用できるようにする必要があると思います。
私は私を助けるかもしれない2つのことを知っています。最初にコピーの省略であり、2番目は移動セマンティクスです。
私の問題は、どちらも正しく使用する方法を知っていることです。私の調査によると、コピーの省略は完全にコンパイラーによって行われ、標準の一部ではありません。私は本当にこれだけに頼る必要はありません。
では、move assigmentが呼び出され、コンパイラーがコピーの省略を実行できないようにするために、それを適切に配置するにはどうすればよいですか。
この場合、これはこれをコーディングするための最も正しい方法ですか?そうでなければ、どうすればそれを改善できますか。C++0xのみの構成を使用できてうれしいです。
ところで:私のコンパイラはgcc4.6です
c++ - 移動セマンティクス==カスタムスワップ関数は廃止されましたか?
最近、独自の機能を提供する方法について多くの 質問が 出てきますswap
。C ++ 11では、セマンティクスをstd::swap
使用std::move
および移動して、指定された値を可能な限り高速に交換します。もちろん、これは、ムーブコンストラクターとムーブ代入演算子(または値渡しを使用する演算子)を指定した場合にのみ機能します。
さて、それを踏まえて、実際swap
にC ++ 11で独自の関数を作成する必要がありますか?私は動かせないタイプしか考えられませんでしたが、繰り返しになりますが、カスタムswap
は通常、ある種の「ポインター交換」(別名移動)を介して機能します。たぶん、特定の参照変数を使用しますか?うーん...
c++ - 移動コンストラクター内で盗む
おもちゃクラスのムーブ コンストラクターの実装中に、次のパターンに気付きました。
パターンは明らかに次のとおりです。
そこで、スティーリングの冗長性を減らし、エラーを起こしにくくするプリプロセッサ マクロを作成しました。
実装は次のようになります。
これには欠点がありますか?プリプロセッサを必要としないよりクリーンなソリューションはありますか?
c++ - 移動操作の条件付きコンパイル
コンパイラが右辺値参照をサポートしているかどうかを確認するにはどうすればよいですか?標準のプリプロセッサマクロはありますか、それとも異なるコンパイラには異なるマクロがありますか?理想的には、これを書きたいと思います。
c++ - C ++ 11コンパイラは、いつRVOとNRVOが移動セマンティクスとconst参照バインディングよりも優れたパフォーマンスを発揮するようになりますか?
移動セマンティクスが有効になっている「全体」オブジェクトが、次のように関数から返される場合を考えてみますstd::basic_string<>
。
次に、返された文字列を移動セマンティクスで使用するかどうかを「最良の」選択にすることが現実的に期待できますか。
または、(N)RVOを使用して実行する必要がある場合
または、const参照を一時的なものにバインドすることもできます
もしあれば、これらのオプションを決定論的に選択するためにどのようなスキームがありますか?
編集1:上記の使用法はstd::wstring
、移動セマンティクスが有効なタイプの単なる例であることに注意してください。それはあなたと交換することもできますarbitrary_large_structure
。:-)
編集2:次のVS 2010で速度最適化リリースビルドを実行するときに、生成されたアセンブリを確認しました。
2つの最も興味深い結果:
- 明示的にmoveコンストラクターの使用を要求
std::move
すると、命令数が3倍になります。report1
- 以下の回答で
report2
JamesMcNellisが指摘しているように、report3
実際には、明示的に呼び出すよりも3分の1の命令で同一のアセンブリを生成しstd::move
ます。
c++ - std::vector の途中で要素を削除すると、移動可能な型でまだコストがかかりますか?
std::vector
穴を埋めるためにすべての要素をコピーする必要があるため、a の途中で要素を削除するのはコストがかかると一般に考えられています。
C++ 11では、std::vector
代わりにすべての要素を下に移動します。これは非常に高速である必要があります(コピーに関してのみ)。少なくともそう思います。確かに時間的には線形ですが、一般的には古いバージョンよりも高速になるはずです。
これは本当ですか?途中でオブジェクトを削除することを心配する必要はありませんか?
c++ - 一部の人々が移動割り当てにスワップを使用するのはなぜですか?
たとえば、stdlibc++ には次のものがあります。
2 つの __u メンバーを *this に直接割り当てないのはなぜですか? スワップは __u に *this メンバーが割り当てられていることを意味しませんか?後で 0 と false を割り当てただけです...その場合、スワップは不要な作業を行っています。私は何が欠けていますか?(unique_lock::swap は、各メンバーで std::swap を実行するだけです)
c++ - std::pair にコピー不可 (ただし移動可能) オブジェクトを格納する
次のように、std::pair 内にコピー不可能な (ただし移動可能な) オブジェクトを格納しようとしています。
しかし、gcc 4.6 で次のコンパイラ エラーが発生します。
std::pair<_T1, _T2>::pair(_U1&&, const _T2&)
コンパイラーがコンストラクターを呼び出そうとしているようですが、もちろん問題があります。std::pair<_T1, _T2>::pair(_U1&&, _U2&&)
代わりにコンパイラがコンストラクタを呼び出すべきではありませんか? ここで何が起こっているのですか?
編集:わかりました、明示的な移動コンストラクターを提供すると問題が解決することは理解していますが、まだ少し混乱しています。
boost::noncopyable
独自のプライベート コピー コンストラクターを宣言するのではなく、から継承することにより、クラスをコピー不可にするとします。
以下は正常に動作し、ムーブ コンストラクターが暗黙的に生成されることを示唆しています。
ただし、std::pair
それでも機能しません。
エラー:
さらに、= default
-ed デフォルト コンストラクターとムーブ コンストラクターを追加しても役に立ちません。
同じエラーが発生します。move コンストラクターの定義を自分で明示的に指定する必要があります。これは、クラスに多くのメンバーがある場合に面倒です。
c++ - ムーブ セマンティクス - それは一体何なのか?
重複の可能性:
移動のセマンティクスを説明してもらえますか?
誰かが私に良い情報源を指摘したり、移動のセマンティクスとは何かをここで説明したりできますか?
c++ - 左辺値を右辺値参照にバインドするときの変数のセマンティクスとライフタイムの移動
ボンネットの下にあるものをよく理解するために...質問はコメントとしてコード内にあります