[解決済み] C++11 rvalues と移動セマンティクスの混乱(return 文)
2022-03-21 13:22:42
質問
C++11のrvalue参照と移動のセマンティクスを理解しようとしています。
これらの例のうち、ベクターコピーをしないのはどちらでしょうか?
最初の例
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();
解決方法は?
最初の例
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> &&rval_ref = return_vector();
最初の例では、一時的なものを返しています。
rval_ref
. このテンポラリは
rval_ref
を定義し、それを値でキャッチしたかのように使用することができます。 これは、次のように非常によく似ています。
const std::vector<int>& rval_ref = return_vector();
ただし、私のリライトでは、明らかに
rval_ref
を非恒久的に使用することができます。
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();
2つ目の例では、ランタイムエラーを発生させていますね。
rval_ref
への参照を保持しています。
tmp
を関数内で使用します。 運が良ければ、このコードはすぐにクラッシュするでしょう。
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つ目の例は、1つ目の例とほぼ同じです。 その
std::move
で
tmp
は不要であり、戻り値の最適化を阻害するため、実際にはパフォーマンスの低下を招く可能性があります。
やっていることをコード化するのに最適なのは
ベストプラクティス
std::vector<int> return_vector(void)
{
std::vector<int> tmp {1,2,3,4,5};
return tmp;
}
std::vector<int> rval_ref = return_vector();
つまり、C++03のときと同じように。
tmp
はreturn文の中で暗黙のうちにrvalueとして扱われます。 これは、return-value-optimization(コピー、移動なし)で返されるか、コンパイラがRVOを実行できないと判断した場合は
は、vector の移動コンストラクタを使用して返します。
. RVO が実行されず、戻り値の型に移動コンストラクタがない場合のみ、戻り値にコピーコンストラクタが使用されます。
関連
-
[解決済み] エラーが発生する。ISO C++は型を持たない宣言を禁じています。
-
[解決済み】C-stringを使用すると警告が表示される。"ローカル変数に関連するスタックメモリのアドレスが返される"
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] ムーブセマンティクスとは何ですか?
-
[解決済み] std::move()とは何ですか?また、どのような場合に使用するのですか?
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】モダンC++はタダで性能を手に入れられる?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++ - 解放されるポインタが割り当てられていないエラー
-
[解決済み】C++コンパイルタイムエラー:数値定数の前に期待される識別子
-
[解決済み] string does not name a type Errorが発生するのはなぜですか?
-
[解決済み】テンプレートの引数1が無効です(Code::Blocks Win Vista) - テンプレートは使いません。
-
[解決済み】C++エラー:の初期化に一致するコンストラクタがありません。
-
[解決済み] 非常に基本的なC++プログラムの問題 - バイナリ式への無効なオペランド
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] c++11 戻り値の最適化か移動か?重複