std::string_view
birkaç durumda daha hızlıdır.
İlk olarak, std::string const&
bir olmak veri gerektirir std::string
, ve bir ham C dizi, bir char const*
C API tarafından döndürülen bir std::vector<char>
bazı seri kaldırma kaçınılması format dönüştürme önler bayt kopyalama motoru, vs. ve üretilen (dize daha uzun olması durumunda SBO¹ özel std::string
uygulama için) bellek tahsisini önler.
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
Davada hiçbir tahsis yapılmaz , ancak foo
a std::string const&
yerine alınıyor string_view
.
İkinci büyük neden, kopya olmadan alt dizelerle çalışmaya izin vermesidir. 2 gigabaytlık bir json dizesi (!) ² ayrıştırdığınızı varsayalım. İçine std::string
ayrıştırırsanız, düğümün adını veya değerini sakladıkları her ayrıştırma düğümü , orijinal verileri 2 gb dizesinden yerel bir düğüme kopyalar .
Bunun yerine, bunları std::string_view
s olarak ayrıştırırsanız , düğümler orijinal verilere başvurur . Bu, ayrıştırma sırasında milyonlarca ayırmayı kaydedebilir ve bellek gereksinimlerini yarıya indirebilir.
Alabileceğiniz hızlanma saçma.
Bu aşırı bir durumdur, ancak diğer "bir alt dize alın ve onunla çalışın" durumları da iyi hızlanmalar üretebilir string_view
.
Kararın önemli bir kısmı, ne kullanarak kaybettiğinizdir std::string_view
. Çok değil, ama bir şey.
Örtük null sonlandırmayı kaybedersiniz ve bu da bununla ilgilidir. Dolayısıyla, aynı dize, tümü bir boş sonlandırıcı gerektiren 3 işleve geçirilecekse, bir std::string
kez dönüştürmek akıllıca olabilir. Bu nedenle, kodunuzun boş bir sonlandırıcıya ihtiyacı olduğu biliniyorsa ve C stili kaynaklı arabelleklerden veya benzerlerinden beslenen dizelerden beklemiyorsanız, belki de a std::string const&
. Aksi takdirde a std::string_view
.
Eğer std::string_view
null sonlandırıldığını (ya da bir şey daha meraklısı) belirten bir işarete sahip olsaydı , a kullanmak için son nedenden bile çıkarırdı std::string const&
.
A std::string
ile hayır almanın a yerine const&
en uygun olduğu bir durum vardır std::string_view
. Aramadan sonra dizenin bir kopyasına sahip olmanız gerekiyorsa, by-value almak etkilidir. SBO durumunda olacaksınız (ve ayırma yok, çoğaltmak için sadece birkaç karakter kopyası) veya yığınla ayrılan arabelleği yerel bir konuma taşıyabilirsinizstd::string
. İki aşırı yüke sahip olmak std::string&&
ve std::string_view
daha hızlı olabilir, ancak sadece marjinal olarak ve mütevazı kod şişmesine neden olur (bu da tüm hız kazançlarına mal olabilir).
¹ Küçük Tampon Optimizasyonu
² Gerçek kullanım durumu.
std::string_view
(char * begin, char * end) çiftinin bir soyutlamasıdır. Bunu yaparkenstd::string
gereksiz bir kopya olur.