2010-04-20 22 views
13

std :: स्ट्रिंग स्टोर डेटा को किसी भी स्टैक या ढेर पर char * से अलग करता है या क्या यह सिर्फ char * से कक्षा में लिया गया है?std :: स्ट्रिंग बनाम char *

+6

पॉइंटर्स (और विशेष रूप से 'char * ') वर्ग प्रकार नहीं हैं, और इन्हें प्राप्त नहीं किया जा सकता है। :-) –

उत्तर

5

यदि आपका मतलब है, तो यह संगत रूप से स्टोर करता है, तो जवाब यह आवश्यक है कि यह आवश्यक नहीं है लेकिन सभी ज्ञात (मेरे लिए, वैसे भी) कार्यान्वयन ऐसा करते हैं। यह सबसे c_str() और data() सदस्य आवश्यकताओं, एक सन्निहित स्ट्रिंग वापस जाने के लिए है जो समर्थन करने के लिए होने की संभावना (c_str() के मामले में अशक्त-समाप्त)

जहाँ तक जहां स्मृति संग्रहीत किया जाता है के रूप में, यह आमतौर पर ढेर पर है। लेकिन कुछ कार्यान्वयन "शॉर्ट स्ट्रिंग ऑप्टिमाइज़ेशन" को नियोजित करते हैं, जिससे लघु स्ट्रिंग सामग्री को एक छोटे से आंतरिक बफर के भीतर संग्रहीत किया जाता है। इसलिए, यदि स्ट्रिंग ऑब्जेक्ट स्टैक पर है, तो यह संभव है कि संग्रहीत सामग्री भी ढेर पर हों। लेकिन इससे आपको कोई फर्क नहीं पड़ता कि आप इसका उपयोग कैसे करते हैं, क्योंकि ऑब्जेक्ट नष्ट हो जाता है, स्ट्रिंग डेटा को संग्रहीत करने वाली मेमोरी किसी भी मामले में अमान्य हो जाती है।

(Btw, यहाँ an article on a similar technique applied generally, जो अनुकूलन बताते है।)

+6

सी ++ 0x समिति ने पाया कि सभी मौजूदा कार्यान्वयन संरचनाएं व्यवस्थित हैं, इसलिए उन्होंने भाषा को मजबूत करने और इसे एक आवश्यकता बनाने का फैसला किया। क्षमा करें मेरे पास इसका बैक अप लेने का संदर्भ नहीं है। –

+0

@ मार्क: मैंने भी सुना है। – GManNickG

+1

@ मार्क रान्ससम: अच्छा बिंदु, हालांकि यह केवल सी ++ 0x + में लागू होगा; सी ++ 98/03 में उस आवश्यकता नहीं है – dcw

13

char*

  • अपने CPU वास्तुकला के लिए एक सूचक का आकार है।
  • malloc या calloc या new या new[] से लौटाया गया मान हो सकता है।
    • यदि हां, तो free या delete या delete[] को भेजे जाने चाहिए जब आप काम हो गया।
    • यदि ऐसा है, तो पात्र ढेर पर संग्रहीत हैं।
  • char[ N ] (निरंतर एन) सरणी या स्ट्रिंग शाब्दिक के "अपघटन" से परिणाम हो सकता है।
    • आम तौर पर, यह बताने का कोई तरीका नहीं है कि char* तर्क बिंदु ढेर, ढेर या वैश्विक स्थान पर है।
  • कक्षा प्रकार नहीं है। यह अभिव्यक्तियों में भाग लेता है लेकिन इसमें कोई सदस्य कार्य नहीं होता है।
  • फिर भी <algorithm> और इस तरह के उपयोग के लिए RandomAccessIterator इंटरफ़ेस लागू करता है।

std::string

  • कई संकेत के आकार, अक्सर तीन है।
  • निर्मित होने पर स्वयं को बनाता है: new या delete की आवश्यकता नहीं है।
    • स्ट्रिंग की प्रतिलिपि का मालिक है, यदि स्ट्रिंग को बदला जा सकता है।
    • इस स्ट्रिंग को char* से कॉपी कर सकते हैं।
    • डिफ़ॉल्ट रूप से, आंतरिक रूप से new[] का उपयोग करता है क्योंकि आप char* प्राप्त करना चाहते हैं।
  • अंतर्निहित रूपांतरण प्रदान करता है जो char* या शाब्दिक से निर्माण को पारदर्शी बनाता है।
  • कक्षा का प्रकार है। अन्य कैटेनेशन जैसे अभिव्यक्तियों के लिए ऑपरेटरों को परिभाषित करता है।
    • c_str() परिभाषित करता है जो अस्थायी उपयोग के लिए char* देता है।
  • begin() और end() साथ std::string::iterator प्रकार लागू करता है।
    • string::iterator लचीला है: एक कार्यान्वयन यह एक स्विच की फ्लिप पर एक सीमा-जाँच को अत्यधिक सुरक्षित डिबगिंग सहायक या बस एक सुपर कुशल char* कर सकते हैं।
2

इन विभिन्न समस्याओं का समाधान। char* (या char const*) एक सी स्टाइल स्ट्रिंग को इंगित करता है जो कि char* पॉइंटर को संग्रहीत करने वाले व्यक्ति के स्वामित्व में नहीं है। सी में, स्ट्रिंग प्रकार की कमी के कारण, आप अक्सर char* "स्ट्रिंग प्रकार" के रूप में उपयोग करते हैं।

std::string उस स्ट्रिंग डेटा का मालिक है जो इसे इंगित करता है। इसलिए यदि आपको अपनी कक्षा में कहीं भी एक स्ट्रिंग स्टोर करने की आवश्यकता है, संभावना है कि आप std::string या char* के बजाय अपनी लाइब्रेरी की स्ट्रिंग क्लास का उपयोग करना चाहते हैं।

std::string के संग्रहण की संगतता पर, अन्य लोगों ने पहले ही उत्तर दिया है।

संबंधित मुद्दे