90

重複の可能性:
const std :: string&をパラメーターとして渡す日は過ぎていますか?

std::string移動セマンティクスがサポートされている場合、値または参照(インライン化されていない関数へ)で渡す必要がありますか?そして、スモールストリング最適化(SSO)を使用した実装についてはどうでしょうか。

4

3 に答える 3

161

文字列で何をしているかに基づいて、複数の回答があります。

1)文字列をIDとして使用します(変更されません)。const参照で渡すのが、おそらくここでの最良のアイデアです。(std::string const&)

2)文字列を変更しますが、呼び出し元にその変更を見せたくない。値で渡すことをお勧めします。(std::string)

3)文字列を変更しますが、呼び出し元にその変更を確認してもらいます。参照によってそれを渡すことが望ましいです:(std::string &)

4)文字列を関数に送信すると、関数の呼び出し元はその文字列を二度と使用しなくなります。移動セマンティクスの使用はオプションかもしれません(std::string &&)

于 2012-05-28T19:52:36.433 に答える
22

C++11についてはこの回答を確認してください。基本的に、左辺値を渡すと右辺値参照

この記事から:

void f1(String s) {
    vector<String> v;
    v.push_back(std::move(s));
}
void f2(const String &s) {
    vector<String> v;
    v.push_back(s);
}

「左辺値引数の場合、「f1」には値による引数を渡すための追加のコピーが1つありますが、「f2」にはpush_backを呼び出すための追加のコピーが1つあります。違いはありません。右辺値引数の場合、コンパイラは一時的なものを作成する必要があります。 'String(L "")'そして、とにかく'f1'または'f2'に一時を渡します。'f2'は、引数が一時(右辺値)の場合にmove ctorを利用できるため、引数は「f1」と「f2」で同じになりました。」

続き:「これは、C ++ 11では、次の場合に値渡しアプローチを使用することでパフォーマンスを向上できることを意味します。

  1. パラメータタイプは移動セマンティクスをサポートします-すべての標準ライブラリコンポーネントはC++11でサポートされます
  2. 移動コンストラクターのコストは、コピーコンストラクターよりもはるかに安価です(時間とスタック使用量の両方)。
  3. 関数内で、パラメータータイプは、コピーと移動の両方をサポートする別の関数または操作に渡されます。
  4. 引数として一時的なものを渡すのが一般的です-これをさらに行うためにコードを整理することができます。

「」

OTOH、C ++ 98の場合は、参照で渡すのが最適です。コピーされるデータが少なくなります。constまたはnonconstを渡すかどうかは、引数を変更する必要があるかどうかによって異なります。

于 2012-05-28T20:01:02.303 に答える
4

通常の答えは、関数でコピーを作成する必要がある場合は、値で渡す必要があるということだと思います。それ以外の場合は、const参照で渡します。

ここに良い議論があります:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/

于 2012-05-28T19:52:39.057 に答える