ハーブがこんなことを言ったのは、こういう場合だからだ。
functionAを呼び出す関数があり、 function をB呼び出すとしますC。とをA介して文字列を渡します。知らない、または気にしない; すべてが知っていることです。つまり、 の実装の詳細です。BCACABCB
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 を使用する小さな文字列には適していません。やる価値はありますか?
ユースケースによって異なります。メモリ割り当てがどれくらい嫌いですか?