タグ付けされた質問 「move-semantics」

12
移動セマンティクスとは何ですか?
C ++ 0xに関するScott Meyersとのソフトウェアエンジニアリングのラジオポッドキャストインタビューを聞いたところです。新機能のほとんどは私にとって理にかなっており、1つを除いて、実際にC ++ 0xに興奮しています。私はまだ移動セマンティクスを取得しません...それは正確には何ですか?

7
push_backとemplace_back
私は少しの違いについて混乱しているpush_backとemplace_back。 void emplace_back(Type&& _Val); void push_back(const Type& _Val); void push_back(Type&& _Val); push_back右辺値参照を取得するオーバーロードがあるので、目的emplace_backがどうなるかよくわかりませんか?


6
C ++ 11右辺値と移動の意味論の混乱(returnステートメント)
私は右辺値参照を理解し、C ++ 11のセマンティクスを移動しようとしています。 これらの例の違いは何ですか?それらのうちどれがベクターコピーを行わないでしょうか? 最初の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return tmp; } std::vector<int> &&rval_ref = return_vector(); 2番目の例 std::vector<int>&& return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector(); 3番目の例 std::vector<int> return_vector(void) { std::vector<int> tmp {1,2,3,4,5}; return std::move(tmp); } std::vector<int> &&rval_ref = return_vector();

3
「* thisの右辺値参照」とは何ですか?
clangのC ++ 11ステータスページで「* thisの右辺値参照」と呼ばれる提案に出くわしました。 私は右辺値参照についてかなり読んで理解しましたが、私はこれについて知っているとは思いません。また、この用語を使用しても、ウェブ上で多くのリソースを見つけることができませんでした。 ページに提案書へのリンクがあります:N2439(移動のセマンティクスを* thisに拡張しています)が、そこから多くの例を取得していません。 この機能については何ですか?

2
最新のC ++でパフォーマンスを無料で取得できますか?
C ++ 11/14は、単にC ++ 98コードをコンパイルする場合でも、パフォーマンスを向上させることができると主張されることがあります。正当化は通常、移動のセマンティクスの線に沿っています。場合によっては、右辺値コンストラクターが自動的に生成されるか、STLの一部となることがあります。今、これらのケースが以前にRVOまたは同様のコンパイラ最適化によって実際にすでに処理されていたかどうか疑問に思っています。 私の質問は、新しい言語機能をサポートするコンパイラを使用して、変更なしでより高速に実行されるC ++ 98コードの実際の例を教えてもらえるかどうかです。コピーの省略を行うのに標準準拠のコンパイラーは必要ないことを理解しています。そのため、移動のセマンティクスによって速度が向上する可能性があります。 編集:明確にするために、私は新しいコンパイラが古いコンパイラよりも高速であるかどうかを尋ねているのではなく、コンパイラフラグに-std = c ++ 14を追加するコードがある場合、それはより高速に実行されます(コピーを避けますが、移動セマンティクス以外に何かを思い付くことができます、私も興味があります)

6
なぜstd :: move an std :: shared_ptrなのでしょうか?
私はClangソースコードを調べていましたが、次のスニペットを見つけました。 void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = std::move(Value); } なぜ私がしたいでしょうか?std::movestd::shared_ptr 共有リソースの所有権を譲渡するポイントはありますか? なぜ私は代わりにこれをしないのですか? void CompilerInstance::setInvocation( std::shared_ptr<CompilerInvocation> Value) { Invocation = Value; }

2
移動したオブジェクトで何ができますか?
規格は、オブジェクトが移動された後でオブジェクトに対して何ができるかを正確に定義していますか?移動元オブジェクトでできることはそれを破壊することだけだと思っていましたが、それだけでは不十分です。 たとえばswap、標準ライブラリで定義されている関数テンプレートを使用します。 template <typename T> void swap(T& a, T& b) { T c = std::move(a); // line 1 a = std::move(b); // line 2: assignment to moved-from object! b = std::move(c); // line 3: assignment to moved-from object! } 明らかに、移動元のオブジェクトに割り当てることが可能でなければなりません。そうしないと、2行目と3行目が失敗します。では、移動元オブジェクトで他に何ができるでしょうか?これらの詳細を規格のどこに正確に見つけることができますか? (ちなみに、なぜ1行目ではT c = std::move(a);なくなのT c(std::move(a));ですか?)

6
std :: unique_ptrメンバーでカスタム削除機能を使用するにはどうすればよいですか?
unique_ptrメンバーを持つクラスがあります。 class Foo { private: std::unique_ptr<Bar> bar; ... }; Barは、create()関数とdestroy()関数を持つサードパーティのクラスです。 std::unique_ptrスタンドアロン関数でwith it を使用したい場合、次のことができます。 void foo() { std::unique_ptr<Bar, void(*)(Bar*)> bar(create(), [](Bar* b){ destroy(b); }); ... } std::unique_ptrクラスのメンバーとしてこれを行う方法はありますか?


4
C ++ 11で型を移動不可能にするのはいつですか?
これが検索結果に表示されないことに驚いたのですが、C ++ 11での移動のセマンティクスの有用性を考えると、誰かが以前にこれを尋ねたのではないかと思いました。 C ++ 11でクラスを移動不可能にする必要があるのはいつですか(または私にとっては良い考えですか)? (理由他の既存のコードとの互換性の問題より。)

1
借用したコンテンツから移動できない、または共有参照の背後から移動できない
エラーがわかりませんcannot move out of borrowed content。何度も受け取って解決してきましたが、なぜなのかわかりません。 例えば: for line in self.xslg_file.iter() { self.buffer.clear(); for current_char in line.into_bytes().iter() { self.buffer.push(*current_char as char); } println!("{}", line); } エラーを生成します: error[E0507]: cannot move out of borrowed content --> src/main.rs:31:33 | 31 | for current_char in line.into_bytes().iter() { | ^^^^ cannot move out of borrowed …

6
代入演算子と `if(this!=&rhs)`を移動します
クラスの代入演算子では、通常、割り当てられているオブジェクトが呼び出し側オブジェクトであるかどうかを確認して、物事を台無しにしないようにする必要があります。 Class& Class::operator=(const Class& rhs) { if (this != &rhs) { // do the assignment } return *this; } 移動代入演算子にも同じものが必要ですか?this == &rhs真実となる状況はありますか? ? Class::operator=(Class&& rhs) { ? }

3
範囲ベースのforループで転送参照を使用する利点は何ですか?
const auto&読み取り専用の操作を実行する場合は十分です。しかし、私はぶつかった for (auto&& e : v) // v is non-const 最近数回。これは私に不思議に思います: またはと比較して、一部のあいまいなケースで、転送参照を使用することでパフォーマンスが向上する可能性はありますauto&かconst auto&? (shared_ptrあいまいなコーナーケースの容疑者です) 更新 お気に入りで見つけた2つの例を。 基本型を反復するときにconst参照を使用することの欠点はありますか? 範囲ベースのforループを使用して、マップの値を簡単に反復できますか? 質問に集中してください:範囲ベースのforループでauto &&を使用する理由は何ですか?

2
std :: move()はどのようにして値をRValuesに転送しますか?
の論理を完全に理解していないことに気づきましたstd::move()。 最初はグーグルで検索しましたが、使用方法についてのドキュメントしかstd::move()なく、構造がどのように機能しているかはわかりません。 つまり、私はテンプレートメンバー関数が何であるかを知っていますがstd::move()、VS2010で定義を調べると、それでも混乱します。 std :: move()の定義は以下になります。 template<class _Ty> inline typename tr1::_Remove_reference<_Ty>::_Type&& move(_Ty&& _Arg) { // forward _Arg as movable return ((typename tr1::_Remove_reference<_Ty>::_Type&&)_Arg); } 最初に奇妙なのは、パラメータ(_Ty && _Arg)です。これは、以下のように関数を呼び出すと、 // main() Object obj1; Object obj2 = std::move(obj1); 基本的には // std::move() _Ty&& _Arg = Obj1; しかし、すでにご存じのように、LValueをRValue参照に直接リンクすることはできません。 _Ty&& _Arg = (Object&&)obj1; ただし、std :: move()がすべての値に対して機能する必要があるため、これは馬鹿げています。 これがどのように機能するかを完全に理解するために、私はこれらの構造体も確認する必要があります。 …

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.