私は模倣Aに設計された内部ライブラリを使用しているC ++ライブラリを提案し、いつか過去数年間で、私はそのインターフェースが使用してから変更を参照std::string
しますstring_view
。
そこで、新しいインターフェースに適合するようにコードを忠実に変更しました。残念ながら、私が渡さなければならないのは、std :: stringパラメーターと、std :: string戻り値です。そのため、私のコードは次のように変更されました。
void one_time_setup(const std::string & p1, int p2) {
api_class api;
api.setup (p1, special_number_to_string(p2));
}
に
void one_time_setup(const std::string & p1, int p2) {
api_class api;
const std::string p2_storage(special_number_to_string(p2));
api.setup (string_view(&p1[0], p1.size()), string_view(&p2_storage[0], p2_storage.size()));
}
私は、この変更がAPIクライアントとして私に何を買ったのか、実際には、コードを増やすこと以外は見当たらないでしょう(おそらく失敗するためです)。API呼び出しの安全性は低下し(APIがパラメーターのストレージを所有しなくなったため)、おそらくプログラム0の作業を節約しました(コンパイラーができる最適化の移動により)。起動後またはどこかで大きなループで行われない、または行われない割り当てがいくつかあります。このAPI用ではありません。
ただし、このアプローチは、他の場所で見られるアドバイス、たとえば次の回答に従うようです。
余談ですが、C ++ 17以降では、std :: string_viewを優先してconst std :: string&を渡すことは避けてください。
主に最適化の目的で、比較的安全なオブジェクトを安全性の低いオブジェクト(基本的には栄光のポインタと長さ)に普遍的に置き換えることを提唱しているように見えるため、このアドバイスは驚くべきものです。
だから、ときなければならない string_view使用すること、そしてときにそれをべきではないのですか?
<string>
ヘッダーにあり、自動的に発生する私の答えを参照してください。そのコードは欺くと間違っています。
std::string_view
コンストラクタを直接呼び出す必要はありませんstd::string_view
。直接取得するメソッドに文字列を渡すだけで、自動的に変換されます。