問題タブ [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++11 - 変換演算子が書かれているにもかかわらず、「既知の変換なし」エラー
私は以下がうまくいくはずだと信じています:
X の引数が 1 つのコンストラクターは 1 つだけX&&
です。Converts オブジェクトは一時的なもので、 に変換されX&&
ます。では、clang-3.3 から次のエラー メッセージが表示されるのはなぜですか。
次のように明示的に演算子を呼び出すことができます。
残念ながら、私が知る限り g++ に基づくideoneで動作します。現在稼働中のオンラインのclangコンパイラはありますか?
c++ - C++11 のムーブ コンストラクターは C++98 のコピー コンストラクターよりも遅い
次の 3 つのクラスを見てみましょう。
それぞれのパフォーマンスを測定する機能もあります。
私がよく理解していないのは、クラスの各インスタンスに対してこのパフォーマンス テストを実行した結果です。IntTab1 は移動コンストラクターと移動代入演算子を noexcept で使用するため、最も高速であると思われます。実際、私の環境では結果は反対です。最速のものは、コピー コンストラクターと代入演算子のみを使用する C++98 バージョンです。ここに私の結果があります:
IntTab の経過時間: 2.2873e-05s
IntTab1 の経過時間: 2.4139e-05s
IntTab2 の経過時間: 2.3554e-05s
誰かがこの奇妙な振る舞いを説明できますか?
編集
間違ったコピー コンストラクター (実際のディープ コピーを実行していない) に関するコメントによると、この動作をテストすると思われるテスト関数があります。
コピー コンストラクターが正しく動作しない場合、この関数が正しく動作するのはなぜですか?
c++ - memcpy でコンストラクターを移動する
コピー不可、移動のみにしたい構造体がありますが、多くのPODが含まれているため、移動コンストラクターの記述は長くなり、変数を忘れるとデバッグが難しくなります。例:
この種のムーブ コンストラクタの問題点は次のとおりです。
どのような問題に直面する可能性があり、これは明確に定義されていますか?
c++ - 「new ClassType(std::move(/*class_object*/))」を使用してフリーストアにオブジェクトを構築する
初心者の質問:
newによって割り当てられたオブジェクトはフリーストアにあります。*これはclone()を呼び出すオブジェクトであり、必ずしも動的に割り当てられたオブジェクトではありません。
移動元オブジェクトと移動先オブジェクトが異なるメモリ領域にある場合、移動メカニズムはどのように機能しますか? それとも、彼らは本当に別の地域にいることはなく、何かが足りないのでしょうか?
私が理解していることから、移動コンストラクターは、移動元オブジェクトのデータ/メモリ部分にリンクする新しいオーバーヘッドを作成します。データ自体は移動/変更されません。上記の場合、これはどのように機能しますか?それが同じように機能する場合、新しい実行後、動的に割り当てられたオブジェクトがフリーストアの外にあることはありませんか (どこにありますか? ) std::move()がどのように/なぜ機能するのか正確にはわかりませんが、名前付きオブジェクトへの右辺値参照を強制的に返し、そのオブジェクトから移動できるようにします。
c++ - 移動コンストラクターとコピー コンストラクターの間のコンパイラの選択
最小限の例:
編集済み:
入力:
出力:
これはライン A またはライン C の In/Output です。代わりにライン B を使用すると、std::move
奇妙な理由が得られます。すべてのバージョンで、出力は入力に依存しません (i の値を除く)。
私の質問:
- バージョン B と C が異なるのはなぜですか?
- A と C のケースでコンパイラがコピーを作成するのはなぜでしょうか?
c++ - C++11 で std priority_queue の要素を移動
最小限の実例。
したがって、これは機能します。ここで、4 行目からコメント記号を削除すると、コピー コンストラクターが必要であることが示されます (私の場合は削除されます)。また、それは逃しoperator=
ます。質問:
- ここでの違いは何ですか?
- 問題は解決できますか? はいの場合はどのように、いいえの場合はなぜですか?
注:回答にboostのpriority_queueを使用することもできますが、同じエラーが発生しました。
c++ - 移動コンストラクターなしでオブジェクトを移動するとどうなりますか?
std::move()
移動コンストラクターを定義していないユーザー定義オブジェクトで が呼び出された場合はどうなりますか? 単純にコピペ?
c++ - 移動コンストラクターの代わりにコピー コンストラクターが呼び出されるのはなぜですか?
次のコードを検討してください。
上記のコードを Visual Studio 2012 でコンパイルしようとすると、次のエラーが発生します。
Error 1 error C2248: 'std::unique_ptr<_Ty>::unique_ptr' : cannot access private member declared in class 'std::unique_ptr<_Ty>'
どうやら、コンパイラは、メソッドにある push_back で move コンストラクターの代わりに copy コンストラクターを呼び出しますaddOuter
。これはコンパイラのバグですか? そうでない場合、この特定のケースでは、移動コンストラクターが呼び出されないのはなぜですか?
c++ - move コンストラクターが呼び出されなかったのはなぜですか?
私はC++ Primer 5th Editionから演習を行っています。これは次のようになります。
演習 13.50: Stringクラスの移動操作に print ステートメントを配置し、ベクトルを使用した§ 13.6.1 (p. 534) の演習 13.48 からプログラムを再実行して、コピーがいつ回避されるかを確認します。(P.544)
はテンプレートを使わずString
に のように振る舞う練習用のクラスです。ファイルstd::string
:String.h
デフォルトの実装、コピーおよび移動コンストラクタ from String.cpp
:
Main.cpp
:
出力:
ご覧のとおり、move コンストラクターはまったく呼び出されていません。ベクトルがより多くのメモリを割り当てているときに、move コンストラクターが呼び出されなかったのはなぜですか?
アップデート:
コンパイラの情報:
main.cpp
印刷能力とその出力:
出力: