दिलचस्प पोस्ट
PHP में छवि का आकार बदलें स्वचालित pydrive सत्यापन प्रक्रिया परीक्षण stream.good () या! Stream.eof () पिछली पंक्ति को दो बार पढ़ता है PHP फ़ंक्शन को फिर से परिभाषित करना? मैं पायथन में कच्चे इनपुट की कई पंक्ति कैसे पढ़ूं? CURLOPT_POSTFIELDS के लिए पोस्ट प्रारूप कर्ल करें क्या JAXB समर्थन xsd: प्रतिबंध? एम्बेडेड XML फ़ाइल को पढ़ना सी # जावा "?" निरर्थक जांच करने के लिए ऑपरेटर – यह क्या है? (टर्नरी नहीं!) सूचक सी से सरणी का आकार प्राप्त करना अवधि के साथ चयनित पाठ नोड को लपेटें GenyMotion Genymotion वर्चुअल डिवाइस को प्रारंभ करने में असमर्थ अतिप्रवाह: अंत में छिपे हुए डॉट्स ऐरे प्लेसमेंट-न्यू को बफर में अनिर्दिष्ट ओवरहेड की आवश्यकता है? ConcurrentLinkedQueue का उपयोग कैसे करें?

STD :: स्ट्रिंग कैसे लागू है?

मैं जानने के लिए उत्सुक हूं कि कैसे std :: string लागू किया गया है और यह सी स्ट्रिंग से कैसे अलग है? यदि मानक किसी भी कार्यान्वयन को निर्दिष्ट नहीं करता है तो स्पष्टीकरण के साथ कोई कार्यान्वयन कैसे मानक द्वारा दी गई स्ट्रिंग आवश्यकता को संतुष्ट करता है, इसके साथ अच्छा होगा?

वेब के समाधान से एकत्रित समाधान "STD :: स्ट्रिंग कैसे लागू है?"

वास्तव में हर कम्पाइलर का उपयोग मैंने रनटाइम के लिए सोर्स कोड प्रदान किया है – ताकि आप जीसीसी या एमएसवीसी या जो भी उपयोग कर रहे हों, आपके पास कार्यान्वयन को देखने की क्षमता है हालांकि, एक बड़ा हिस्सा या सभी std::string को टेम्पलेट कोड के रूप में लागू किया जाएगा, जो बहुत मुश्किल पढ़ने के लिए कर सकते हैं।

स्कॉट मेयर की पुस्तक, प्रभावी एसटीएल , में स्टडी :: स्ट्रिंग कार्यान्वयन पर एक अध्याय है, जो आम बदलावों का एक सभ्य अवलोकन है: "आइटम 15: string कार्यान्वयन में विविधताओं से अवगत रहें"।

वह 4 विविधताओं के बारे में बात करता है:

  • रेफरी-गिनती कार्यान्वयन पर कई रूपांतर (आमतौर पर लिखे जाने पर प्रतिलिपि के रूप में जाना जाता है) – जब कोई स्ट्रिंग ऑब्जेक्ट अपरिवर्तित प्रतिलिपि बनाई जाती है, रिफैंक बढ़ता है लेकिन वास्तविक स्ट्रिंग डेटा नहीं है। जब तक कि ऑब्जेक्ट में से कोई भी इसे संशोधित नहीं करता, तब तक दोनों ऑब्जेक्ट एक ही रेफ्रैक्टेड डेटा को इंगित करता है, जिसके कारण डेटा की 'लिखी' प्रतिलिपि होती है। विविधताएं हैं जहां रिफॉकाउंट, लॉक इत्यादि जैसी चीजें संग्रहीत हैं।

  • एक "लघु स्ट्रिंग अनुकूलन" (एसएसओ) कार्यान्वयन इस प्रकार में, ऑब्जेक्ट में डेटा, लम्बाई, गतिशील रूप से आवंटित बफर के आकार के सामान्य सूचक होते हैं, लेकिन यदि स्ट्रिंग पर्याप्त कम है, तो वह उस क्षेत्र का इस्तेमाल बफर को गतिशील रूप से आवंटित करने के बजाय स्ट्रिंग को रखने के लिए करेगा

इसके अलावा, हर्ब सटर की "अधिक असाधारण सी ++" में एक परिशिष्ट (परिशिष्ट ए है: "ऑप्टिमाइज़ेशन जो कि (एक मल्टीथ्रेडेड वर्ल्ड में नहीं)") चर्चा करता है कि सिंक्रनाइज़ेशन समस्याओं के कारण मल्टिथ्रेडड एप्लीकेशन में अक्सर समस्याएं क्यों हैं यह आलेख ऑनलाइन भी उपलब्ध है (लेकिन मुझे यकीन नहीं है कि यह वही है जो किताब में है):

उन दोनों अध्यायों को पढ़ने योग्य होगा।

std :: string एक ऐसा वर्ग है जो किसी तरह के आंतरिक बफर के आसपास लपेटता है और उस बफर को छेड़छाड़ करने के तरीके प्रदान करता है।

सी में एक स्ट्रिंग केवल वर्णों की एक सरणी है

Std :: स्ट्रिंग कार्य करता है की सभी बारीकियों को समझाने में बहुत लंबा समय लगेगा शायद जीसीसी स्रोत कोड http://gcc.gnu.org पर नजर डालें ताकि वे यह कैसे देख सकें।

इस पृष्ठ पर एक उत्तर में कार्यान्वयन एक उदाहरण है।

इसके अलावा, आप जीसीसी के कार्यान्वयन को देख सकते हैं, मान लें कि आपने जीसीसी इंस्टॉल किया है। यदि नहीं, तो आप एसवीएन के माध्यम से अपने स्रोत कोड का उपयोग कर सकते हैं । अधिकांश std :: string मूल_स्ट्रिंग द्वारा लागू किया गया है, इसलिए वहां से शुरू करें।

जानकारी का एक अन्य संभावित स्रोत Watcom के संकलक है

तार के लिए सी ++ समाधान सी-वर्जन से काफी अलग हैं। सबसे पहले और सबसे महत्वपूर्ण अंतर है जबकि सी का उपयोग एएससीआईआईजीएस समाधान, std :: string और std :: wstring वास्तविक स्ट्रिंग को स्टोर करने के लिए दो आईटरेटर (पॉइंटर) का उपयोग कर रहे हैं। स्ट्रिंग कक्षाओं का मूल उपयोग गतिशील आवंटित समाधान प्रदान करता है, इसलिए गतिशील स्मृति से निपटने के साथ सीपीयू ओवरहेड की लागत से यह स्ट्रिंग को और अधिक आरामदायक से निपटने देता है।

जैसा कि आप शायद पहले से ही जानते हैं, सी में कोई भी अंतर्निहित सामान्य स्ट्रिंग प्रकार नहीं है, केवल मानक लाइब्रेरी के माध्यम से स्ट्रिंग ऑपरेशन के कुछ ही प्रदान करता है। सी और सी ++ के बीच में एक बड़ा अंतर है, जो सी ++ एक लिपटे कार्यक्षमता प्रदान करता है, इसलिए यह एक नकली सामान्य प्रकार के रूप में माना जा सकता है।

सी में आपको स्ट्रिंग के माध्यम से चलने की जरूरत है यदि आप इसे की लंबाई जानना चाहते हैं, तो std :: string :: size () सदस्य फ़ंक्शन केवल एक अनुदेश (अंत – शुरू) है मूल रूप से। जब तक आपके पास मेमोरी हो, तब तक आप सुरक्षित रूप से एक स्ट्रिंग जोड़ सकते हैं, इसलिए बफर अतिप्रवाह बग्स (और इसलिए शोषण) के बारे में चिंता करने की कोई जरूरत नहीं है, क्योंकि एन्डिंग से बड़ा बफ़र बनाता है यदि इसकी आवश्यकता होती है।

जैसा कि पहले किसी को बताया गया था, स्ट्रिंग वेक्टर की कार्यक्षमता से तैयार की जाती है, एक templated तरीके से, इसलिए यह multibyte- वर्ण प्रणालियों से निपटने के लिए आसान बनाता है। आप टाइपिंगफ़ std :: basic_string specific_str_t का उपयोग कर अपने स्वयं के स्ट्रिंग प्रकार को परिभाषित कर सकते हैं; टेम्प्लेट पैरामीटर में किसी भी प्रकार के डेटा प्रकार के साथ अभिव्यक्ति।

मुझे लगता है कि दोनों तरफ पर्याप्त पेशेवर और संभोग हैं:

सी + + स्ट्रिंग पेशेवरों: – कुछ मामलों में तेजी से पुनरावृत्ति (निश्चित रूप से आकार का उपयोग करके, और स्मृति से डेटा की जांच करने के लिए यह नहीं है कि क्या आप स्ट्रिंग के अंत में हैं, दो बिंदुओं की तुलना करते हैं। कैशिंग) – बफर ऑपरेशन स्ट्रिंग कार्यक्षमता के साथ पैक किए गए हैं, बफर समस्याओं के बारे में इतनी कम चिंताएं

सी + + स्ट्रिंग विपक्ष: – गतिशील स्मृति आवंटन सामग्री के कारण, बुनियादी उपयोग के प्रदर्शन पर असर पड़ सकता है। (सौभाग्य से आप स्ट्रिंग ऑब्जेक्ट को बता सकते हैं कि मूल बफर आकार क्या होना चाहिए, इसलिए जब तक आप इसे पार नहीं कर लेते, यह स्मृति से गतिशील ब्लॉक आवंटित नहीं करेगा) – अन्य भाषाओं की तुलना में अक्सर अजीब और असंगत नाम। यह किसी भी स्टिल सामग्री के बारे में बुरी बात है, लेकिन आप इसका उपयोग कर सकते हैं, और यह थोड़ा विशिष्ट सी ++ इश लग रहा है। – टेम्पलेटिंग का भारी उपयोग हेडर आधारित समाधानों का उपयोग करने के लिए मानक पुस्तकालय को बलों करता है, इसलिए यह संकलन समय पर एक बड़ा प्रभाव है।

यह आपके द्वारा उपयोग किए जाने वाले मानक पुस्तकालय पर निर्भर करता है

उदाहरण के लिए एसटीएलपोर्ट एक सी ++ मानक पुस्तकालय कार्यान्वयन है जो अन्य चीजों के बीच तार लागू करता है।