std::string_view
कुछ मामलों में तेज है।
सबसे पहले, std::string const&
डेटा की आवश्यकता होती है std::string
, और एक कच्चे सी सरणी नहीं, char const*
सी एपीआई द्वारा लौटाया जाता है, std::vector<char>
कुछ डीरिएरलाइजेशन इंजन द्वारा निर्मित, आदि से बचा जाता है, बचा हुआ प्रारूप रूपांतरण बाइट्स की नकल करने से बचता है, और यदि स्ट्रिंग की तुलना में लंबा है। SBO S विशेष std::string
कार्यान्वयन के लिए) एक स्मृति आवंटन से बचा जाता है।
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 गीगाबाइट जोंस स्ट्रिंग (!) Ose पार्स कर रहे हैं। यदि आप इसे पार्स करते हैं std::string
, तो प्रत्येक ऐसे पार्स नोड जहां वे नोड के नाम या मूल्य को संग्रहीत करते हैं , मूल डेटा को 2 जीबी स्ट्रिंग से एक स्थानीय नोड में कॉपी करते हैं।
इसके बजाय, यदि आप इसे std::string_view
s पर पार्स करते हैं , तो नोड्स मूल डेटा को संदर्भित करते हैं। यह पार्स करने के दौरान लाखों आवंटन बचा सकता है और मेमोरी आवश्यकताओं को आधा कर सकता है।
स्पीडअप आपको मिल सकता है बस हास्यास्पद है।
यह एक चरम मामला है, लेकिन अन्य "एक विकल्प प्राप्त करते हैं और इसके साथ काम करते हैं" मामलों के साथ सभ्य स्पीडअप भी उत्पन्न कर सकते हैं string_view
।
निर्णय का एक महत्वपूर्ण हिस्सा वह है जो आप उपयोग करके खो देते हैं std::string_view
। यह ज्यादा नहीं है, लेकिन यह कुछ है।
आप निहित शून्य समाप्ति खो देते हैं, और यह इसके बारे में है। तो अगर एक ही स्ट्रिंग को 3 कार्यों के लिए पारित किया जाएगा, जिसमें सभी को एक शून्य टर्मिनेटर की आवश्यकता होती है, जो एक std::string
बार बुद्धिमान हो सकता है। इस प्रकार यदि आपके कोड को एक शून्य टर्मिनेटर की आवश्यकता के लिए जाना जाता है, और आप सी-शैली के खट्टे बफ़र्स या इस तरह से खिलाए गए तार की उम्मीद नहीं करते हैं, तो शायद एक ले लें std::string const&
। नहीं तो ए std::string_view
।
यदि std::string_view
एक ध्वज था जो कहा गया था कि यदि इसे समाप्त कर दिया गया था (या कुछ कट्टर) तो यह उस अंतिम उपयोग को भी हटा देगा std::string const&
।
एक ऐसा मामला है जहां std::string
कोई नहीं के साथ एक const&
इष्टतम पर एक है std::string_view
। यदि आपको कॉल के बाद अनिश्चित रूप से स्ट्रिंग की एक प्रति के स्वामी होने की आवश्यकता है, तो बाय-वैल्यू लेना कुशल है। आप या तो एसबीओ मामले में होंगे (और कोई आवंटन नहीं, बस कुछ चरित्र प्रतियां इसे डुप्लिकेट करने के लिए), या आप हीप-आवंटित बफर को एक स्थानीय में स्थानांतरित करने में सक्षम होंगे std::string
। दो ओवरलोड होने std::string&&
और std::string_view
तेज हो सकते हैं, लेकिन केवल मामूली रूप से, और यह मामूली कोड ब्लोट का कारण होगा (जो आपको गति के सभी लाभ प्राप्त कर सकता है)।
¹ छोटे बफर अनुकूलन
Case वास्तविक उपयोग का मामला।
std::string_view
सिर्फ एक अमूर्त है (चार * शुरू, चार * अंत) जोड़ी। आप इसका उपयोग तब करते हैं जबstd::string
एक अनावश्यक प्रतिलिपि होगी।