मैं हाल ही में कुछ आवश्यक अनुकूलन कर रहा हूँ। एक चीज जो मैं कर रहा हूं, वह कुछ ओस्ट्रिंगस्ट्रीम -> स्प्रिंटफ्स को बदल रही है। मैं स्प्रिंटफिंग कर रहा हूं: एस डी का एक गुच्छा :: स्ट्रिंग से एसी शैली की सरणी, अला
char foo[500];
sprintf(foo, "%s+%s", str1.c_str(), str2.c_str());
यह पता चला है कि Microsoft का std :: string :: c_str () कार्यान्वयन निरंतर समय में चलता है (यह सिर्फ एक आंतरिक पॉइंटर लौटाता है)। ऐसा प्रतीत होता है कि libstdc ++ ऐसा ही करता है । मुझे पता है कि std c_str के लिए कोई गारंटी नहीं देता है, लेकिन ऐसा करने के दूसरे तरीके की कल्पना करना कठिन है। यदि, उदाहरण के लिए, उन्होंने मेमोरी में कॉपी किया तो उन्हें या तो एक बफर के लिए मेमोरी आवंटित करनी होगी (इसे नष्ट करने के लिए कॉलर को छोड़ना होगा - एसटीएल अनुबंध का हिस्सा नहीं) या उन्हें आंतरिक स्टैटिक में कॉपी करना होगा बफर (शायद थ्रेडसेफ़ नहीं है, और आपको इसके जीवनकाल की कोई गारंटी नहीं है)। तो बस एक आंतरिक रूप से बनाए रखा अशक्त समाप्त स्ट्रिंग के लिए एक सूचक लौटना ही यथार्थवादी समाधान लगता है।
c_str
एक कास्ट विधि है (या कम से कम एक कॉन्स्टेबल अधिभार है - मैं भूल जाता हूं कि कौन सा), यह तार्किक मान को नहीं बदलता है, इसलिए इसका एक कारण हो सकता हैmutable
। यह अन्य कॉल से पॉइंटर्स को तोड़ देगा , सिवाय इसके कि कोई भी पॉइंटर्स एक ही लॉजिकल स्ट्रिंग को संदर्भित करता है (ताकि फिर से जुड़ने का कोई नया कारण न हो - पहले से ही एक शून्य टर्मिनेटर होना चाहिए) या फिर पहले से ही एक गैर के लिए एक कॉल होना चाहिए। बीच में विधि।c_str