std::string_view
lebih cepat dalam beberapa kasus.
Pertama, std::string const&
membutuhkan data dalam a std::string
, dan bukan array C mentah, char const*
dikembalikan oleh API C, yang std::vector<char>
dihasilkan oleh beberapa mesin deserialisasi, dll. Konversi format yang dihindari menghindari menyalin byte, dan (jika string lebih panjang dari SBO¹ untuk std::string
implementasi tertentu ) menghindari alokasi memori.
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] );
}
Tidak ada alokasi yang dilakukan dalam string_view
kasus ini, tetapi akan ada jika foo
mengambil std::string const&
alih a string_view
.
Alasan kedua yang sangat besar adalah bahwa ia memungkinkan bekerja dengan substring tanpa salinan. Misalkan Anda mengurai string 2 gigabyte json (!) ². Jika Anda menguraikannya std::string
, masing-masing node parse di mana mereka menyimpan nama atau nilai dari sebuah node menyalin data asli dari string 2 gb ke node lokal.
Sebagai gantinya, jika Anda menguraikannya ke std::string_view
s, node merujuk ke data asli. Ini dapat menghemat jutaan alokasi dan membagi dua persyaratan memori selama parsing.
Speedup yang bisa Anda dapatkan cukup konyol.
Ini adalah kasus yang ekstrim, tetapi kasus "dapatkan substring dan bekerja dengannya" yang lain juga dapat menghasilkan speedup yang layak string_view
.
Bagian penting dari keputusan adalah apa yang Anda hilangkan dengan menggunakan std::string_view
. Tidak banyak, tapi itu sesuatu.
Anda kehilangan terminasi nol implisit, dan hanya itu saja. Jadi jika string yang sama akan diteruskan ke 3 fungsi yang semuanya membutuhkan terminator nol, konversi ke std::string
sekali mungkin bijaksana. Jadi, jika kode Anda diketahui membutuhkan terminator nol, dan Anda tidak mengharapkan string diumpankan dari buffer bersumber gaya C atau sejenisnya, mungkin ambil a std::string const&
. Kalau tidak ambil a std::string_view
.
Jika std::string_view
memiliki bendera yang menyatakan apakah itu nol diakhiri (atau sesuatu yang lebih menarik) itu akan menghapus bahkan alasan terakhir untuk menggunakan a std::string const&
.
Ada kasus di mana mengambil std::string
dengan tidak const&
optimal lebih dari a std::string_view
. Jika Anda perlu memiliki salinan string tanpa batas waktu setelah panggilan, mengambil menurut nilai lebih efisien. Anda akan berada dalam case SBO (dan tidak ada alokasi, hanya beberapa salinan karakter untuk menduplikasinya), atau Anda akan dapat memindahkan buffer yang dialokasikan heap ke lokal std::string
. Memiliki dua kelebihan std::string&&
dan std::string_view
mungkin lebih cepat, tetapi hanya sedikit, dan itu akan menyebabkan kode gembung sederhana (yang dapat dikenakan biaya semua kenaikan kecepatan).
¹ Optimasi Penyangga Kecil
² Kasus penggunaan aktual.
std::string_view
hanyalah abstraksi dari pasangan (char * begin, char * end). Anda menggunakannya saat membuatstd::string
salinan yang tidak perlu.