問題タブ [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++ - コピーおよび移動する 2 つのコンストラクターの結合
現在、私のおもちゃクラス テンプレートの 1 つには、非常によく似た 2 つのコンストラクターがあります。
それらを単一のコンストラクター テンプレートに結合できますか、それともセマンティクスが何らかの形で変更されますか?
c++ - ポインタまたはオブジェクトをクラスに格納しますか?
ただの設計/最適化の質問。ポインタやオブジェクトをいつ保存しますか、またその理由は何ですか。たとえば、私はこれらの両方の作業を信じています(コンパイルエラーを除いて):
スタックまたはヒープでインスタンス化するときに1つの違いが生じると思いますか?
例えば:
また、sizeof(A)
< sizeof(B)
?私が見逃している他の問題はありますか?(ダニエルはコメントの彼の関連する投稿で継承の問題について私に思い出させました)
スタック割り当ては一般にヒープ割り当てよりも高速ですが、AのサイズはBよりも小さいので、これらは、移動セマンティクスを使用しても問題のケースでパフォーマンスをテストせずに答えることができないトレードオフの1つですか?または、経験則いくつかのルールを使用する方が有利な場合はどうでしょうか。(San Jacintoは、スタック/ヒープの割り当てが高速であり、スタック/ヒープではないことについて私を修正しました)
より多くのコピーを作成すると、同じパフォーマンスの問題が発生すると思います(3つのコピーは、最初のインスタンスを開始する場合と同様のパフォーマンスヒットの約3倍になります)。しかし、移動構築は、スタックを可能な限り使用する方が有利な場合がありますか?
これは関連する質問ですが、まったく同じではありません。 C ++ STL:オブジェクト全体を保存する必要がありますか、それともオブジェクトへのポインターを保存する必要がありますか?
ありがとう!
c++ - 型キャストとstd::move()の使用の違いは?
最新のC++標準に追加されたばかりの新しい関数std::move()について少し興味があります。
それについての記事を読み終えて、関数の定義が
これは、std::moveの呼び出しとキャストの使用に違いがないようです。
たとえば、ここでは、
基本的に違いはないと考えるのは正しいですか?まあ、私は自分が正しいと確信していますが、自信がありすぎると常に裏目に出ることも知っています。
前もって感謝します!
c++ - std :: move()はどのように値をRValuesに転送しますか?
のロジックを完全に理解していないことに気づきましたstd::move()
。
最初はグーグルで検索しましたが、構造がどのように機能するかではなく、使い方に関するドキュメントしかstd::move()
ないようです。
つまり、テンプレートメンバー関数が何であるかは知っていますがstd::move()
、VS2010の定義を調べると、それでも混乱を招きます。
std :: move()の定義は以下のとおりです。
私にとって最初に奇妙なのは、パラメーター(_Ty && _Arg)です。これは、以下に示すように関数を呼び出すと、
それは基本的に等しい
しかし、すでにご存知のように、LValueをRValue参照に直接リンクすることはできません。そのため、このようにする必要があると思います。
ただし、std :: move()はすべての値に対して機能する必要があるため、これはばかげています。
したがって、これがどのように機能するかを完全に理解するには、これらの構造体も確認する必要があります。
残念ながら、それはまだ混乱を招き、私にはわかりません。
これはすべて、C++に関する基本的な構文スキルが不足しているためです。これらがどのように機能するのかを知りたいのですが、インターネットで入手できるドキュメントは大歓迎です。(これを説明できれば、それも素晴らしいでしょう)。
c++ - std::vector メンバーの std::vector を使用してクラスの移動セマンティクスを実装する適切な方法
ベクトルのベクトルであるメンバーを持つクラスがあります。単一ベクトルへの右辺値参照を引数として取り、それをベクトル引数の単一要素ベクトルとしてメンバ ベクトルに移動する、このクラスのコンストラクタを作成したいと思います。これまでのところ、私は持っています:
これは正しく動作しているように見えますが、std::move
アラウンドvec
が必要かどうかはわかりません。または、std::vector
私が少し違った方法で書いていれば、私のためにこれの多くを処理していたでしょう.
c++ - C++11ファイルストリーム
C ++ 11の移動セマンティクスにより、例外の使用が容易になりましたかstd::ifstream
、std::ofstream
それとも安全になりましたか?標準ライブラリにもよると思います。GCC、ICC、VC ++コンパイラの間に違いはありますか?
string - C++ 文字列構築におけるムーブ セマンティクスと R 値参照
C++11 は、次のような引数文字列構造のセマンティクスと右辺値参照を移動しますか?
たとえば、仮定宣言
の冗長なヒープコピーを防止できるようにし"abc"
ます。
もしそうなら、それは不必要にconst char
ラッパーboost::cref
を利用しboost::const_string
ますか?
c++ - 移動セマンティクスと参照セマンティクス
各「ノード」にブランチ/サブツリーのリストがあるツリーのようなコンテナーを作成しています。現在、私の頭は次のようになっています。
これで、2 番目のコンストラクターが内部にツリーを作成しますが、_root
これは呼び出しでどのように機能しますか (プライベート違反を無視します):
Branch
&*Base.subtrees.begin()
が同じノードを参照するようにするにはどうすればよいですか? それとも、他の方法で行くべきですか。add_branch()
ブランチ/サブツリーの作成に使用しますか?
c++ - コンストラクターと静的配列を移動する
私はC++ でムーブ コンストラクターの可能性を探ってきましたが、以下のような例で、この機能を利用する方法を知りたいと思っていました。次のコードを検討してください。
上記の例で、(MSVC++ 2011 を使用して) プログラムをトレースすると、 のFoo<N>::Foo(Foo<N>&&)
構築時に が呼び出されていることがわかりfoo
ます。これは望ましい動作です。ただし、 がない場合はFoo<N>::Foo(Foo<N>&&)
、Foo<N>::Foo(const Foo<N>&)
代わりに , が呼び出され、冗長なコピー操作が行われます。
私の質問は、コードに記載されているように、静的に割り当てられた単純な配列を使用しているこの特定の例では、移動コンストラクターを使用してこの冗長なコピーを回避する方法はありますか?
c++ - 移動するとオブジェクトは使用可能な状態になりますか?
2 つのベクトルがあり、一方を他方に移動するとしv1 = std::move(v2)
ます。v2
この後も使える状態でしょうか?