[解決済み] rvalueの参照で返す方が効率的か?
2022-05-30 18:32:46
質問
例えば
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
どのように解決するのですか?
Beta_ab&&
Beta::toAB() const {
return move(Beta_ab(1, 1));
}
これは、lvalue参照の場合と同じように、ぶら下がった参照を返します。関数が戻った後、一時的なオブジェクトは破壊されます。を返すべきです。
Beta_ab
を値で返すようにします。
Beta_ab
Beta::toAB() const {
return Beta_ab(1, 1);
}
これで、ちゃんと一時的な
Beta_ab
オブジェクトを関数の戻り値に適切に移動しています。もしコンパイラが可能なら、RVO (return value optimization) を使って移動を完全に回避します。これで、次のようなことができるようになりました。
Beta_ab ab = others.toAB();
そして、テンポラリを
ab
に移動するか、あるいはRVOを実行して、移動またはコピーを完全に省略します。私はあなたが読むことをお勧めします
BoostCon09 Rvalue リファレンス 101
を読んで、この問題と(N)RVOがどのように相互作用するかを説明することをお勧めします。
rvalueの参照を返すというあなたのケースは、他の場面でも良いアイデアでしょう。例えば
getAB()
関数があるとします。この関数がrvalueのテンポラリに対してconst lvalueの参照を返すのは最適ではありません。このように実装することができます。
struct Beta {
Beta_ab ab;
Beta_ab const& getAB() const& { return ab; }
Beta_ab && getAB() && { return move(ab); }
};
なお
move
はオプションではありません。
ab
はローカル自動でも一時的なrvalueでもないからです。さて、この
ref-qualifierは
&&
は、2番目の関数がrvalueのテンポラリに対して呼び出され、コピーではなく、次のような動きをすることを述べています。
Beta_ab ab = Beta().getAB();
関連
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】C++プログラムでのコンソールの一時停止
-
[解決済み] 要素ごとの加算は、結合ループよりも分離ループの方がはるかに高速なのはなぜですか?
-
[解決済み] C++でextern "C "を使用した場合の効果は?
-
[解決済み] なぜ、オブジェクトそのものではなく、ポインタを使用しなければならないのですか?
-
[解決済み] C++11の'typedef'と'using'の違いは何ですか?
-
[解決済み] C++11 rvalues と移動セマンティクスの混乱(return 文)
-
[解決済み] 関数からunique_ptrを返す
-
[解決済み] Intel CPU の _mm_popcnt_u64 で、32 ビットのループカウンターを 64 ビットに置き換えると、パフォーマンスが著しく低下します。
-
[解決済み】「*this の rvalue 参照」とは何ですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み】 != と =! の違いと例(C++の場合)
-
[解決済み】文字列関数で'char const*'のインスタンスを投げた後に呼び出されるterminate [閉店].
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】オブジェクト引数のない非静的メンバ関数の呼び出し コンパイラーエラー
-
[解決済み】VC++の致命的なエラーLNK1168:書き込みのためにfilename.exeを開くことができません。
-
[解決済み】システムが指定されたファイルを見つけられませんでした。
-
[解決済み】エラー。引数リストに一致するコンストラクタのインスタンスがない
-
[解決済み】c++で.txtファイルから2次元の配列に読み込む