मैं std::string_view का उपयोग करने के लिए प्रेरणा को समझता हूं;
यह फ़ंक्शन तर्कों में अनावश्यक आवंटन से बचने में मदद कर सकता है।मैं std :: string_view के बजाय कॉन्स्ट और std :: स्ट्रिंग कब पास करूंगा?
उदाहरण के लिए:
निम्नलिखित कार्यक्रम एक स्ट्रिंग शाब्दिक से एक 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 के बजाय मैं std :: स्ट्रिंग को const & द्वारा कब चुनूं?
std::string_view
के इंटरफेस को देखते हुए, यह लगता है जैसे कि मैं std::string
की सभी आवृत्तियों कि const&
द्वारा पारित कर रहे हैं बदल सकते थे। क्या इसके लिए कोई काउंटर उदाहरण हैं? std::string_view
पैरामीटर पास करने के लिए std::string const&
को प्रतिस्थापित करने के लिए है?
मैं यह कहने जा रहा था: यदि फ़ंक्शन पैरामीटर को एक अलग std :: स्ट्रिंग में आंतरिक रूप से छीनने जा रहा था, तो प्रति-निर्माण स्ट्रिंग-टू-स्ट्रिंग-व्यू-टू-स्ट्रिंग राउंड-ट्रिप से सस्ता होगा । लेकिन मुझे एहसास हुआ कि basic_string_view याद रख सकता है कि इसे एक स्ट्रिंग से बनाया गया था, और केवल उसी को अपनी to_string() विधि से वापस कर दें। –
@SamVarshavchik: यदि आप एक प्रतिलिपि बनाने जा रहे हैं, तो आप तर्क के आधार पर तर्क स्वीकार करना चाहते हैं ताकि यह या तो प्रतिलिपि हो या स्थानांतरित हो सके। – GManNickG