std::string_view
いくつかのケースではより高速です。
まず、std::string const&
データがでありstd::string
、生のC配列ではなく、char const*
C APIによって返されたstd::vector<char>
、一部の逆シリアル化エンジンによって生成されたなどである必要があります。回避された形式変換は、バイトのコピーを回避し、(文字列が特定のstd::string
実装のSBO implementation)は、メモリ割り当てを回避します。
void foo( std::string_view bob ) {
std::cout << bob << "\n";
}
int main(int argc, char const*const* argv) {
foo( "This is a string long enough to avoid the std::string SBO" );
if (argc > 1)
foo( argv[1] );
}
string_view
ケースでは割り当ては行われませんfoo
が、のstd::string const&
代わりにが取られた場合はありstring_view
ます。
2番目の本当に大きな理由は、コピーなしで部分文字列を操作できることです。2ギガバイトのjson文字列(!)²を解析するとします。それをに解析するとstd::string
、ノードの名前または値を格納する各解析ノードは、2 GBの文字列からローカルノードに元のデータをコピーします。
代わりに、それをstd::string_view
sに解析すると、ノードは元のデータを参照します。これにより、数百万の割り当てを節約し、解析中のメモリ要件を半分にすることができます。
あなたが得ることができるスピードアップはばかげています。
これは極端なケースですが、他の「部分文字列を取得して操作する」ケースでも、を使用して適切なスピードアップを生成できstring_view
ます。
決定の重要な部分は、を使用することで失うものですstd::string_view
。それは多くはありませんが、それは何かです。
暗黙のnull終了を失う、それはそれについてです。そのため、同じ文字列が3つの関数に渡され、そのすべてにnullターミネータが必要な場合、std::string
一度に変換するのが賢明です。したがって、コードにnullターミネーターが必要であることがわかっていて、Cスタイルのソースバッファーなどからの文字列を期待しない場合は、を使用することができますstd::string const&
。それ以外の場合はstd::string_view
。
std::string_view
nullで終了した(またはより洗練された)かどうかを示すフラグがある場合は、を使用する最後の理由も削除されますstd::string const&
。
std::string
なしconst&
でa をとることがに最適な場合がありstd::string_view
ます。呼び出し後に文字列のコピーを無期限に所有する必要がある場合は、値渡しを行うのが効率的です。SBOの場合(割り当てはなく、複製するための数文字のコピーのみ)、またはヒープが割り当てられたバッファーをローカルに移動できますstd::string
。2つのオーバーロードを持つstd::string&&
とstd::string_view
より高速かもしれませんが、わずかに、それは(あなたの速度の向上のすべてを要することができる)ささやかなコードの膨張を引き起こします。
¹小さなバッファーの最適化
²実際の使用例。
std::string_view
(char * begin、char * end)ペアの単なる抽象化です。std::string
不要なコピーを作成するときに使用します。