[解決済み] C++11のデフォルトはpass-by-valueが妥当か?
2022-05-16 10:04:27
質問
伝統的なC++では、関数やメソッドに値を渡すことは大きなオブジェクトでは遅く、一般に嫌われることです。代わりに、C++ プログラマーは参照を渡す傾向があり、これは高速ですが、所有権や特にメモリ管理 (オブジェクトがヒープで割り当てられている場合) に関するあらゆる種類の複雑な問題を引き起こします。
C++11 では、Rvalue 参照と移動コンストラクタがあり、大きなオブジェクト(たとえば
std::vector
のような)大きなオブジェクトを実装することができ、関数への値の受け渡しが安価になります。
のような型のインスタンスは値で渡すのがデフォルトであるということでしょうか?
std::vector
と
std::string
? カスタムオブジェクトの場合はどうでしょうか?新しいベストプラクティスは何ですか?
どのように解決するのですか?
それは、合理的なデフォルトの もし は、本文の中にコピーを作成する必要があります。これは、Dave Abrahams が が提唱している :
ガイドライン 関数の引数をコピーしてはいけません。代わりに、値で渡して、コンパイラにコピーをさせる。
コードでは、これをするなということです。
void foo(T const& t)
{
auto copy = t;
// ...
}
が、こうする。
void foo(T t)
{
// ...
}
これは、呼び出し側が
foo
のように
T lval;
foo(lval); // copy from lvalue
foo(T {}); // (potential) move from prvalue
foo(std::move(lval)); // (potential) move from xvalue
となり、最小限の作業しか行われません。リファレンスで同じことをするには、2つのオーバーロードが必要です。
void foo(T const&);
と
void foo(T&&);
.
それを踏まえて、今度は自分の評価済みコンストラクタをこのように書いてみました。
class T {
U u;
V v;
public:
T(U u, V v)
: u(std::move(u))
, v(std::move(v))
{}
};
それ以外の場合、参照渡しで
const
への参照渡しはまだ合理的です。
関連
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】Visual Studio 2013および2015でC++コンパイラーエラーC2280「削除された関数を参照しようとした」が発生する
-
[解決済み】リンカーエラーです。"リンカ入力ファイルはリンクが行われていないため未使用"、そのファイル内の関数への未定義参照
-
[解決済み】C++の余分な資格エラー
-
[解決済み】クラステンプレートの使用にはテンプレート引数リストが必要です
-
[解決済み】エラー:free(): 次のサイズが無効です(fast)。
-
[解決済み] const std::string & をパラメータとして渡す時代は終わったのでしょうか?
-
[解決済み] C++で「オブジェクトを返す」方法とは?
-
[解決済み】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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Visual Studio 2015で「非標準の構文; '&'を使用してメンバーへのポインターを作成します」エラー
-
[解決済み] [Solved] Error C1083: Cannot open include file: 'stdafx.h'
-
[解決済み】致命的なエラー LNK1169: ゲームプログラミングで1つ以上の多重定義されたシンボルが発見された
-
[解決済み] error: 'if' の前に unqualified-id を期待した。
-
[解決済み] 既に.objで定義されている-二重包含はない
-
[解決済み】エラー。switchステートメントでcaseラベルにジャンプする
-
[解決済み】エラー:不完全な型へのメンバーアクセス:前方宣言の
-
[解決済み】 while(cin) と while(cin >> num) の違いは何ですか?)
-
[解決済み] スタックアロケーションにより初期化されていない値が作成された
-
[解決済み】C++で関数にオブジェクトを渡すには?