2009-12-21 33 views
16

मैं अपने आवेदन में स्ट्रिंग्स और त्रुटि संदेशों का निर्माण करने के लिए बड़े पैमाने पर std::stringstream का उपयोग करता हूं। stringstreams आमतौर पर बहुत कम जीवन स्वचालित चर होते हैं।क्या मुझे std :: stringstream preallocate करना चाहिए?

क्या इस तरह के उपयोग प्रत्येक चर के लिए ढेर reallocation का कारण होगा? क्या मुझे अस्थायी से कक्षा-सदस्य stringstream चर से स्विच करना चाहिए?

बाद के मामले में, मैं stringstream बफर कैसे आरक्षित कर सकता हूं? (क्या मुझे इसे एक बड़ी पर्याप्त स्ट्रिंग के साथ शुरू करना चाहिए या क्या कोई और सुरुचिपूर्ण विधि है?)

उत्तर

11

क्या आपने अपना निष्पादन प्रोफाइल किया है, और उन्हें धीमा करने का स्रोत माना है?

उनके उपयोग पर विचार करें। क्या वे अधिकतर आपके कोड के सामान्य प्रवाह के बाहर त्रुटि संदेशों के लिए हैं?

जहां तक ​​अंतरिक्ष के आरक्षण के रूप में ...

कुछ कार्यान्वयन शायद एक छोटे से बफर आरक्षित से पहले किसी भी आवंटन stringstream के लिए जगह लेता है। Std :: स्ट्रिंग के कई कार्यान्वयन यह करते हैं।

एक अन्य विकल्प (अपरीक्षित!) हो सकता है

std::string str; 
str.reserve(50); 
std::stringstream sstr(str); 

आप इस gamedev thread में कुछ और अधिक विचार हो सकता है।

संपादित करें:

stringstream's rdbuf के साथ आसपास mucking भी एक समाधान हो सकता है। यद्यपि यह दृष्टिकोण शायद गलत होने के लिए बहुत आसान है, इसलिए be sure it's absolutely necessary कृपया। निश्चित रूप से सुरुचिपूर्ण या संक्षिप्त नहीं है।

+0

अच्छी सलाह; हालांकि, 50 को आरक्षित करने के बाद उस स्ट्रिंग को कॉपी करने से बदले में एक छोटे गैर-हीप बफर ऑप्टिमाइज़ेशन को नुकसान हो सकता है (यदि आपके कार्यान्वयन में एक है)। यदि आप अपना खुद का स्ट्रीमबफ लिखना चाहते हैं, तो आपके पास सभी बफर प्रबंधन पर सटीक नियंत्रण है; फिर आप ओस्ट्रीम (या आईट्रीम या आईओस्ट्रीम का उपयोग करेंगे, लेकिन सवाल यह इंगित करता है कि आउटपुट स्वरूपण यहां चिंता है) rdbuf के माध्यम से स्ट्रिंगस्ट्रीम के बफर को बदलने के बजाए आपके स्ट्रीमबफ के साथ। –

+6

मुझे लगता है कि स्ट्रिंगस्ट्रीम आरक्षित कुछ भी 'str' की सामग्री लंबाई (जो 0 है) से अधिक नहीं है। Cplusplus.com के अनुसार: "सामग्री के रूप में स्ट्र की एक प्रति के साथ एक ostringstream ऑब्जेक्ट बनाता है।" संदर्भ sais "स्ट्रिंग सामग्री की प्रति"। यह स्पष्ट रूप से नहीं कहता है कि यह समान मात्रा में स्मृति को सुरक्षित रखता है। मुझे कोई भी स्रोत नहीं मिला जो इस कन्स्ट्रक्टर का उपयोग करके स्मृति को आरक्षित करने के बारे में कुछ भी कहता है। – NickSoft

+0

आपके द्वारा ऊपर उपयोग किए जाने वाले निर्माता अब मान्य नहीं हैं। आप देख सकते हैं कि नो-कॉपी कन्स्ट्रक्टर हटा दिया गया था। http://www.cplusplus.com/reference/sstream/stringstream/stringstream/ – user1122069

1

मुझे यकीन नहीं है, लेकिन मुझे संदेह है कि stringbufstringstreamstring के साथ कड़ाई से संबंधित है। इसलिए मुझे संदेह है कि ss के अंतर्निहित string के अंदर reserved को बाइट्स की मात्रा आरक्षित करने के लिए ss.seekp(reserved-1); ss.put('\0'); का उपयोग कर सकते हैं। असल में मैं ss.seekp(reserved); ss.trunc(); जैसे कुछ देखना चाहता हूं, लेकिन धाराओं के लिए trunc() विधि नहीं है।

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