std::string
移動セマンティクスがサポートされている場合、値または参照(インライン化されていない関数へ)で渡す必要がありますか?そして、スモールストリング最適化(SSO)を使用した実装についてはどうでしょうか。
3 に答える
文字列で何をしているかに基づいて、複数の回答があります。
1)文字列をIDとして使用します(変更されません)。const参照で渡すのが、おそらくここでの最良のアイデアです。(std::string const&)
2)文字列を変更しますが、呼び出し元にその変更を見せたくない。値で渡すことをお勧めします。(std::string)
3)文字列を変更しますが、呼び出し元にその変更を確認してもらいます。参照によってそれを渡すことが望ましいです:(std::string &)
4)文字列を関数に送信すると、関数の呼び出し元はその文字列を二度と使用しなくなります。移動セマンティクスの使用はオプションかもしれません(std::string &&)
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では、次の場合に値渡しアプローチを使用することでパフォーマンスを向上できることを意味します。
- パラメータタイプは移動セマンティクスをサポートします-すべての標準ライブラリコンポーネントはC++11でサポートされます
- 移動コンストラクターのコストは、コピーコンストラクターよりもはるかに安価です(時間とスタック使用量の両方)。
- 関数内で、パラメータータイプは、コピーと移動の両方をサポートする別の関数または操作に渡されます。
- 引数として一時的なものを渡すのが一般的です-これをさらに行うためにコードを整理することができます。
「」
OTOH、C ++ 98の場合は、参照で渡すのが最適です。コピーされるデータが少なくなります。constまたはnonconstを渡すかどうかは、引数を変更する必要があるかどうかによって異なります。
通常の答えは、関数でコピーを作成する必要がある場合は、値で渡す必要があるということだと思います。それ以外の場合は、const参照で渡します。
ここに良い議論があります:http://cpp-next.com/archive/2009/08/want-speed-pass-by-value/