問題タブ [move-constructor]
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++ - プロパティとしてプライベート オブジェクトを持つクラスのムーブ コンストラクターと代入演算子を作成するにはどうすればよいですか?
今日はMove Constructorsを学びました。この回答を読み、その中の移動コンストラクターの例を自分のコードに適用しようとしました。
ただし、その例とは異なり、私のクラスUnicodeString
には単純な C 配列が含まれているだけではありません。これには、std::vector<>
私が作成した別のクラスのインスタンスを要素とするオブジェクトが含まれています。
まず、move コンストラクターで、R-Value で渡された他のオブジェクトのベクターを盗むにはどうすればよいでしょうか。UString
次に、代入演算子でUString
、メインUnicodeString
オブジェクトの s の参照と R-Value によって渡される参照を効率的に交換するにはどうすればよいですか? はプライベート プロパティであるため、別のオブジェクトから直接アクセスできないことに注意してください。UString
c++ - Move 代入演算子を呼び出して Move コンストラクターを実装する
MSDN の記事How to: Write a Move Constuctorには、次の推奨事項があります。
クラスにムーブ コンストラクターとムーブ代入演算子の両方を提供する場合、ムーブ コンストラクターを記述してムーブ代入演算子を呼び出すことにより、冗長なコードを削除できます。次の例は、move 代入演算子を呼び出す move コンストラクターの改訂版を示しています。
このコードはMemoryBlock
の値を二重に初期化することで非効率的ですか? それとも、コンパイラは余分な初期化を最適化して取り除くことができますか? 移動代入演算子を呼び出すことによって、常に移動コンストラクターを作成する必要がありますか?
c++ - 派生オブジェクトが基底クラス参照にバインドされたときのコピー/移動/変換セマンティック?
C++ をできるだけ理解したい。基底クラスB
と派生クラスがある場合D
。D d;
派生オブジェクトをインスタンス化します。
B & rb = d;
、rb
派生オブジェクト を参照しますd
。これは、基本クラスの新しいオブジェクトをインスタンス化しません。では、どのメモリ部分がrb
参照されているのでしょうか?B newb = d;
、これは基本クラスのコピーコンストラクターを呼び出します。オブジェクトd
は最初にパラメーター type にバインドされ、const B&
次に基本クラスの新しいオブジェクトがインスタンス化されます。B newbb(static_cast<B>(d));
、このステートメントで何が達成されますか?
上記の 3 つのステートメントはcopy/move/conversion
、オブジェクトの を理解するための私自身の方法です。しかし、彼らは本当に私を混乱させます。C++11 standardの対応する部分を読みましたが、コードを解釈する効果的で明確な方法を見つけることができません。
コードの引用で3つのステートメントを説明する答えを願っています。オブジェクトのコピー/移動/変換中に何が起こったか。
ヘルプ!皆さんからの回答を願っています!!
c++ - 移動コンストラクターが「右辺値参照」を使用する必要があるのはなぜですか?
たとえば、次の移動コンストラクターは&&
(rvalue 参照)なしで機能します。
なぜ必要なのかがよくわかりません…
c++ - コピー/移動コンストラクターの奇妙な動作と大きなオブジェクトを返す方法は?
私は最近、しばらく不在だったのですが、再び C++11 を試していました。インターネットで多くの記事を読んだ後、ファクトリ関数からラージ オブジェクトを返す最も効率的な方法 (基本的には、データベース)。
私はunique_ptrのファンになりましたが、いくつかの記事で、新しいムーブコンストラクターのおかげで、大きなベクトルを値で返すことが完全に可能になり、これらの新しいセマンティクスにより、1つのポインターをコピーするのと同じくらい高速になるはずだと読みました.
これを試すために、さまざまなコンストラクターで出力を行う小さなテスト プログラムを作成しました。
およびテスト済み
これをそのままコンパイルすると、コンパイラはさまざまなコンストラクター呼び出しを最適化 (「省略」) し、出力を取得します。
わかりましたが、コピーがどれだけ最適化されているかがわかります。「指定された」動作が何であるかを確認するために、フラグ -fno-elide-constructors を使用してこれをコンパイルしました (Apple LLVM バージョン 4.2 (clang-425.0.28) を使用しています)。しかし、次の出力が得られます。
したがって、明らかに、値が返されるオブジェクトで怪しいことが起こっています。明らかに、これは単なる小さな問題ではありません。なぜなら、-fno-elide-constructors はセマンティクスを変更せず、関与するコンストラクターの量だけを変更すると予想していたからです。
したがって、私は尋ねます:
- 何が起こっている?値オブジェクトが文字列パラメータを「失う」のはなぜですか? そしてどこに?
- 値の戻り値に問題があるように見えますが、他の戻り値は問題なく機能します。では、なぜ人々は最近、価値を返し、「残りはシステムが処理する」ことを推奨しているのでしょうか?
- 大きなオブジェクトを返す良い方法は何ですか?
- 見えないところでどこか間違っていますか?
ありがとう!
c++ - 暗黙的に宣言された移動コンストラクターに依存するのは安全ですか?
これは、私がこの情報のほとんどを入手した場所です: http://en.cppreference.com/w/cpp/language/move_constructor
どうやらこれらは、暗黙的に生成された移動コンストラクターが機能するための条件です。
- ユーザー宣言のコピー コンストラクターがない
- ユーザー宣言のコピー代入演算子はありません
- ユーザー宣言の移動代入演算子はありません
- ユーザーが宣言したデストラクタはありません
- 暗黙的に宣言された移動コンストラクターが削除済みとして定義されていません
- ユーザーが宣言した移動コンストラクターが存在する場合でも、キーワードを使用して暗黙的に宣言された移動コンストラクターの生成を強制することができます。
default
私の質問は次のとおりです。
- 暗黙の自動移動コンストラクターに頼るのは安全ですか?
- デフォルトのコピー コンストラクターの代わりに実際に機能するかどうかを確認するにはどうすればよいですか?
- 最後に、そして最も重要なこととして、それは良いアイデアであり、その理由は何ですか? それとも、常に自分で定義する方が良いですか?
私は3 つのルールに従い、デストラクタ、コピー アンド ムーブ コンストラクタ、コピー アンド ムーブ代入演算子を手動で作成する傾向がありますが、この暗黙的なものについては興味があります。
c++11 - 定数の右辺値を取る移動コンストラクターのポイントは何ですか?
http://en.cppreference.com/w/cpp/language/move_constructorによると; "クラスは複数のムーブ コンストラクタを持つことができます。たとえば、T::T(const T&&)
とT::T(T&&)
"
move-constructor に定数の右辺値を渡したいのはいつですか?