2009-07-12 12 views
10

मेरे एप्लिकेशन में बहुत सारी स्ट्रिंग्स की प्रतिलिपि बनाने सहित मेमोरी की समस्याएं हैं, जिसमें कई हैंशटेबल्स आदि में चाबियाँ हैं। I ' मैं अपने तारों के लिए बेस क्लास की तलाश में हूं जो इसे बहुत ही कुशल बनाता है।मेमोरी-कुशल सी ++ स्ट्रिंग्स (इंटर्निंग, रस्सी, कॉपी-ऑन-राइट, इत्यादि)

मैं के लिए आशा करती हूं कि:

  • स्ट्रिंग होना शामिल (एक ही मूल्य के कई तार एक ही स्मृति का उपयोग),
  • कॉपी-ऑन-राइट (मैं इस लगभग सभी एसटीडी में मुक्त करने के लिए आता है लगता है :: स्ट्रिंग कार्यान्वयन),
  • रस्सियों वाला कुछ बोनस होगा (ओ (1) -श सम्मेलन के लिए)।

मेरा प्लेटफ़ॉर्म लिनक्स पर g ++ है (लेकिन इससे कोई फर्क नहीं पड़ता)।

क्या आप ऐसी पुस्तकालय के बारे में जानते हैं?

उत्तर

5

यदि आपके अधिकांश तार अपरिवर्तनीय हैं, तो Boost Flyweight लाइब्रेरी आपकी आवश्यकताओं के अनुरूप हो सकती है।

यह स्ट्रिंग इंटर्निंग करेगा, लेकिन मुझे विश्वास नहीं है कि यह कॉपी-ऑन-राइट करता है।

+0

यदि मैं इसे std :: स्ट्रिंग को लपेटने के लिए उपयोग करता हूं, ऐसा लगता है कि यह कॉपी-ऑन-राइट को नुकसान नहीं पहुंचाएगा। –

9

कॉपी-ऑन-राइट

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

इसके अतिरिक्त, सभी आधुनिक सी ++ कंपाइलर NRVO प्रदर्शन करते हैं और अधिकांश मामलों में रिटर्न वैल्यू स्ट्रिंग की प्रतिलिपि बनाने की आवश्यकता को खत्म करते हैं। चूंकि यह कॉपी-ऑन-राइट सेमेन्टिक्स के लिए सबसे आम मामलों में से एक रहा है, इसलिए उपर्युक्त डाउनसाइड्स के कारण इसे हटा दिया गया है।

+4

मल्टीथ्रेडिंग मुद्दों का उल्लेख नहीं करना ... –

+2

इसके अलावा, कुछ तारों में ढेर नहीं बल्कि डेटा संग्रहित करने के लिए एक एम्बेडेड छोटे बफर का उपयोग करके एक छोटा स्ट्रिंग अनुकूलन होता है। आश्चर्य की बात है, हालांकि, जीसीसी की डिफ़ॉल्ट स्ट्रिंग क्लास (libstdC++) कॉपी-ऑन-राइट करता है। –

+1

सी ++ 11 गाय स्ट्रिंग कक्षाओं को प्रतिबंधित करता है – Ghita

2

पौराणिक पॉल ह्सिह

+0

यह बहुत अच्छा लग रहा है लेकिन इसमें गंभीर रूप से इटरेटर की कमी है। –

+2

मुझे किसी लाइब्रेरी लिखने पर भरोसा नहीं होगा, जो कहता है कि "बस्ट्रलिब डिज़ाइन द्वारा, मेमोरी आकार ओवरफ्लो हमलों के लिए अभद्र है। कारण यह है कि लम्बाई ओवरफ्लो के लिए यह लचीला है कि bstring लंबाई INT_MAX से ऊपर की ओर है, (~ size_t) 0। "। फिर भी एक और शौकिया जो सोचता है कि उसे एक चांदी की बुलेट मिली है, इस तरह यह प्रतीत होता है। – MSalters

+0

ऐसा लगता है कि मैं कुछ भी नहीं ढूंढ रहा हूं ... –

5

आंद्रेई Alexandrescu की 'Policy Based basic_string implementation' से The Better String Library पर एक नजर डालें मदद मिल सकती है।

+0

यह बहुत मदद नहीं करता है, लेकिन यह कम-से-कम भयानक नहीं है। –

+0

यह थोड़ी देर हो गया है क्योंकि मैंने इसे पढ़ा है, लेकिन जब मैंने आपकी पोस्ट देखी तो यह दिमाग में आया। –

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