2011-12-05 11 views
6

मुझे एक प्रोजेक्ट मिला है जिसमें मुझे बड़ी फ़ाइलों को पढ़ने/लिखने की आवश्यकता है।दृश्य स्टूडियो पर std :: स्ट्रिंग का विशिष्ट व्यवहार?

मैंने ifstream :: read() का उपयोग करने का निर्णय लिया है ताकि उन फ़ाइलों को एक ही पास में एक std :: स्ट्रिंग में स्मृति में रखा जा सके। (कि सी में यह करने के लिए सबसे तेज़ तरीका ++ हो रहा है: http://insanecoding.blogspot.com/2011/11/how-to-read-in-file-in-c.html और http://insanecoding.blogspot.com/2011/11/reading-in-entire-file-at-once-in-c.html)

जब फ़ाइलों के बीच स्विच, मैं तो ("रीसेट" करने के लिए std :: स्ट्रिंग पिछले स्मृति बफर के रूप में इस्तेमाल की जरूरत है यानी, मिटा चार [] मुक्त स्मृति को बफ़र)

मैंने कोशिश की:

std::string::clear() 
std::string::assign("") 
std::string::erase(0, std::string::npos) 
std::string::resize(0) 
std::string::reserve(0) 

लेकिन, विजुअल स्टूडियो 2008 के तहत, इस std :: स्ट्रिंग के अंदर ही इस्तेमाल किया स्मृति मुक्त नहीं करता है: उसके अंतर्निहित बफर आवंटित नहीं है।

एकमात्र तरीका जिसे मैंने इसे हटाने के लिए पाया है वह std :: string :: swap (std :: string ("")) को कॉल करना है ताकि वास्तविक std :: स्ट्रिंग और खाली एक के बीच आंतरिक बफर बदलना पड़े। परम में

मैं इस व्यवहार थोड़ा अजीब ...

मैं केवल विजुअल स्टूडियो 2008 पर परीक्षण किया, मैं अगर यह एक एसटीएल मानक व्यवहार नहीं जानता या अगर यह MSVC विशिष्ट है पाते हैं।

क्या आप मुझे कुछ सुराग प्राप्त कर सकते हैं?

+5

स्वैपिंग कंटेनरों को आरक्षित स्मृति जारी करने का एक मानक तरीका है। और 'std :: string' का उपयोग कर फ़ाइल पढ़ने का तरीका इष्टतम तरीके से बंद है। –

+1

@VladLazarenko: मानक, और संभवतः सबसे तेज़। – Nawaz

+3

क्यों ** ** आप किसी को भी बफर को रद्द करने की उम्मीद करेंगे? सी ++ 11 डिसलोकेशन के लिए एक बाध्यकारी अनुरोध करने के लिए स्पष्ट 'shrink_to_fit() 'जोड़ता है। –

उत्तर

4

जैसा कि Vlad और Alf ने टिप्पणी की, std::string().swap(the_string)the_string की क्षमता को रिलीज़ करने के लिए C++ 98 तरीका है, और the_string.shrink_to_fit() सी ++ 11 तरीका है।

क्यों clear(), erase(), resize() इत्यादि ऐसा नहीं करते हैं, यह एक स्ट्रिंग का उपयोग करते समय आवंटन को कम करने का एक अनुकूलन है। यदि clear() स्ट्रिंग की क्षमता को मुक्त करता है, तो आपको आमतौर पर अगली पुनरावृत्ति पर समान मात्रा में स्थान आवंटित करना होगा, जिससे क्षमता को बनाए रखने के लिए कार्यान्वयन कुछ समय लगेगा। यह कार्यान्वयन मानक द्वारा गारंटी नहीं है, लेकिन यह कार्यान्वयन में बहुत आम है।

reserve() एक res_arg तर्क क्षमता की तुलना में कम() एक गैर बाध्यकारी छोटा अनुरोध प्रभाव में है के साथ

कॉलिंग आरक्षित() के साथ दर्ज है। Res_arg < = आकार() के साथ एक कॉल प्रभावी रूप से एक गैर बाध्यकारी संकीर्ण-से-फिट अनुरोध है।

जो दर्शाता है कि कार्यान्वयन reserve() कॉल पर क्षमता को रिलीज़ करने की अधिक संभावना है। अगर मैं उन्हें सही पढ़ रहा हूं, libc++ और libstdC++ रिलीज स्पेस करते हैं जब आप reserve(0) पर कॉल करते हैं, लेकिन यह विपरीत विकल्प बनाने के लिए वीसी ++ की लाइब्रेरी के लिए व्यावहारिक है।

संपादित करें: पेनेलोप कहते हैं, std::string का व्यवहार यहां std::vector के व्यवहार जैसा ही है।

+1

मैं बस जोड़ना चाहता हूं ... 'स्ट्रिंग का व्यवहार ज्यादातर' वेक्टर 'जैसा होता है ... और यदि आप' std :: vector' में डेटा जोड़ते हैं, जब इसका आकार आरक्षित क्षमता तक पहुंच जाता है, तो यह क्षमता युगल है (और जब आकार कम हो जाता है तो कुछ भी नहीं होता है)। इस तरह, वेक्टर के पीछे सम्मिलन समय अभी भी कम-से-कम स्थिर होता है जबकि अभी भी कुशल स्मृति-वार होता है: स्मृति आरक्षण (धीमी गति से) समय के साथ तेजी से कम बार-बार किया जाता है, जबकि वेक्टर का आकार कभी नहीं होता है आवश्यक आकार की तुलना में दोगुनी से अधिक – penelope

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