ハーブがこんなことを言ったのは、こういう場合だからだ。
functionA
を呼び出す関数があり、 function をB
呼び出すとしますC
。とをA
介して文字列を渡します。知らない、または気にしない; すべてが知っていることです。つまり、 の実装の詳細です。B
C
A
C
A
B
C
B
A が次のように定義されているとします。
void A()
{
B("value");
}
B と C が で文字列を取る場合const&
、次のようになります。
void B(const std::string &str)
{
C(str);
}
void C(const std::string &str)
{
//Do something with `str`. Does not store it.
}
すべて順調です。ポインターを渡すだけで、コピーも移動もせず、みんな幸せです。文字列を保存しないためC
、 a を取ります。const&
それは単にそれを使用します。
ここで、簡単な変更を 1 つ加えたいと思いC
ます。文字列をどこかに保存する必要があります。
void C(const std::string &str)
{
//Do something with `str`.
m_str = str;
}
こんにちは、コンストラクターと潜在的なメモリ割り当てをコピーします ( Short String Optimization (SSO)は無視してください)。C++11 のムーブ セマンティクスは、不要なコピー構築を削除できるはずですよね? そしてA
一時的に渡します。データをコピーC
しなければならない理由はありません。与えられたものを放棄するだけです。
できないことを除いて。かかるからconst&
です。
C
パラメータを値で取得するように変更すると、そのパラメータB
へのコピーが行われるだけです。私は何も得ません。
したがって、データをシャッフルすることstr
に依存して、すべての関数を値渡ししていれば、この問題は発生しません。std::move
誰かがそれを保持したい場合は、保持できます。そうでない場合は、まあ。
それはより高価ですか?はい; 値への移動は、参照を使用するよりもコストがかかります。コピペより安いの?SSO を使用する小さな文字列には適していません。やる価値はありますか?
ユースケースによって異なります。メモリ割り当てがどれくらい嫌いですか?