मैं एक आंतरिक पुस्तकालय का उपयोग कर रहा हूं जिसे एक प्रस्तावित C ++ पुस्तकालय की नकल करने के लिए डिज़ाइन किया गया था , और पिछले कुछ वर्षों में मुझे इसका इंटरफ़ेस उपयोग std::string
करने से बदल गया है string_view
।
इसलिए मैं नए इंटरफ़ेस के अनुरूप अपने कोड को कर्तव्यपूर्वक बदल देता हूं। दुर्भाग्य से, मुझे जो पास करना है वह एक std :: string पैरामीटर, और कुछ ऐसा है जो std :: string return value है। तो मेरा कोड कुछ इस तरह से बदल गया:
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 क्लाइंट के रूप में खरीदा, जो कि अधिक कोड (संभवतः स्क्रू अप करने के लिए) के अलावा था। एपीआई कॉल कम सुरक्षित है (एपीआई अब अपने मापदंडों के लिए भंडारण के मालिक नहीं होने के कारण), संभवत: मेरे कार्यक्रम 0 कार्य को सहेजा गया (चालें अनुकूलन के कारण कंपाइलर अब कर सकते हैं), और यहां तक कि अगर यह काम नहीं बचा, तो यह केवल होगा आवंटन का एक जोड़ा है जो स्टार्टअप के बाद या कहीं बड़े लूप में नहीं होगा और न ही होगा। इस एपीआई के लिए नहीं।
हालाँकि, यह दृष्टिकोण मुझे कहीं और देखने की सलाह का पालन करता है, उदाहरण के लिए यह उत्तर :
एक तरफ के रूप में, C ++ 17 के बाद से आपको एक const std पास करने से बचना चाहिए :: string & a std के पक्ष में :: string_view:
मुझे वह सलाह आश्चर्यजनक लगी, क्योंकि यह मुख्य रूप से अनुकूलन के प्रयोजनों के लिए कम सुरक्षित एक (मूल रूप से महिमा सूचक और लंबाई) के साथ एक अपेक्षाकृत सुरक्षित वस्तु की जगह सार्वभौमिक रूप से प्रतिस्थापित करने की वकालत करता प्रतीत होता है।
तो जब चाहिए string_view इस्तेमाल किया जा, और जब यह नहीं करना चाहिए?
<string>
हेडर में है और स्वचालित रूप से होता है। वह कोड धोखा और गलत है।
std::string_view
कंस्ट्रक्टर को सीधे कॉल नहीं करना चाहिए , आपको स्ट्रिंग्स कोstd::string_view
सीधे लेने की विधि को पास करना चाहिए और यह स्वचालित रूप से परिवर्तित हो जाएगा।