私はstd::string_viewを使用する動機を理解しています。
これは、関数の引数に不要な割り当てを避けるのに役立ちます。例えばstd :: string_viewの代わりにconst&std :: stringを渡すのはいつですか?
:
次のプログラムは、文字列リテラルからstd::string
を作成します。
これは望ましくない動的割り当てを引き起こします。これは、文字を観察することだけに興味があるからです。
#include <iostream>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::string const& str){}
int main(){
observe_string("hello world"); //prints [allocating 36 bytes]
}
string_view
を使用することで問題を解決します:
#include <iostream>
#include <experimental/string_view>
void* operator new(std::size_t n)
{
std::cout << "[allocating " << n << " bytes]\n";
return malloc(n);
}
void observe_string(std::experimental::string_view const& str){
}
int main(){
observe_string("hello world"); //prints nothing
}
これは質問を私に残します。
関数引数にstring_viewの代わりにconst &でstd :: stringを選択するのはいつですか?私はconst&
によって渡されstd::string
のすべてのインスタンスを置き換えることができているかのよう
はstd::string_view
のインタフェースを見ると、それが見えます。これに反例がありますか? std::string_view
はパラメータを渡すためにstd::string const&
を置き換えることを意味していますか?
私は、関数がパラメータを離散的なstd :: stringに内部的に隠すつもりならば、コピー構築は文字列から文字列へのビューから文字列へのラウンドトリップよりも安いでしょう。しかし、basic_string_viewはそれが文字列から構築されたことを記憶し、同じto_string()メソッドから同じものを返すことに気付きました。 –
@SamVarshavchik:もしあなたがコピーを作ろうとするなら、あなたは引数で値を受け入れて、それをコピーまたは移動構築することができます。 – GManNickG