2010-03-01 12 views
8

मैं एक एम्बेडेड ऐप लिख रहा हूं। कुछ स्थानों पर, मैं std :: ostringstream का बहुत उपयोग करता हूं, क्योंकि यह मेरे उद्देश्यों के लिए बहुत सुविधाजनक है। हालांकि, मुझे अभी पता चला है कि प्रदर्शन हिट चरम है और स्ट्रीम परिणामों में डेटा जोड़कर मॉलोक और मुफ्त में बहुत सी कॉल में परिणाम मिलता है। क्या इससे बचने का कोई तरीका है?क्या ओस्ट्रिंगस्ट्रीम मॉलोक/फ्री को कम करने का कोई तरीका है?

मेरा पहला विचार ostringstream स्थिर बना रहा था और ostringstream :: set ("") का उपयोग कर इसे रीसेट कर रहा था। हालांकि, ऐसा नहीं किया जा सकता क्योंकि मुझे कार्यों को पुनर्वित्त की आवश्यकता है।

+0

डुप्पे http://stackoverflow.com/questions/1941064/should-i-preallocate-stdstringstream –

+0

हम्म ... डुप्लिक प्रश्न वैध जवाब नहीं देता है, हालांकि। –

+0

इसके अलावा, "डुप्ली" एक उत्तर पूर्व मानता है। – MSalters

उत्तर

2

अच्छा, Booger का समाधान sprintf() पर स्विच करना होगा। यह असुरक्षित है, और त्रुटि-प्रवण है, लेकिन यह अक्सर तेज़ होता है।

हालांकि हमेशा नहीं। प्रारंभिकरण के बाद हम अपने वास्तविक समय की नौकरी पर इसका उपयोग नहीं कर सकते (या ostringstream) क्योंकि दोनों मेमोरी आवंटन और विध्वंस करते हैं।

समस्या के चारों ओर हमारा रास्ता यह सुनिश्चित करने के लिए बहुत सारे हुप्स से कूदना है कि हम स्टार्टअप पर सभी स्ट्रिंग रूपांतरण करते हैं (जब हमें अभी तक वास्तविक समय नहीं होना चाहिए)। मुझे लगता है कि एक ऐसी स्थिति थी जहां हमने अपना स्वयं का कनवर्टर एक निश्चित आकार के स्टैक-आवंटित सरणी में लिखा था। हमारे पास आकार पर कुछ बाधाएं हैं जिन्हें हम प्रश्न में विशिष्ट रूपांतरणों के लिए भरोसा कर सकते हैं।

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

+0

इसके बजाय आप इसका क्या उपयोग करते हैं? –

+0

मैंने इसे जोड़ना शुरू किया, लेकिन बैक आउट किया। मैं आगे बढ़ जाऊंगा और इसे तुम्हारे लिए रखूंगा। –

+0

आप कम से कम स्नप्रिंटफ (स्टैक बफर के साथ) का उपयोग कर सकते हैं, लेकिन मैं तब तक इसका समर्थन नहीं करता जब तक प्रोफाइलिंग शो यह आपको लाभ प्रदान न करे और आप तय करते हैं कि दोषों का उपयोग करने के लायक हैं। –

2

यदि आप जानते हैं कि स्ट्रीम बनाने से पहले डेटा कितना बड़ा है, तो आप ओस्ट्रस्ट्रीम का उपयोग कर सकते हैं जिसका निर्माता पैरामीटर के रूप में बफर ले सकता है। इस प्रकार डेटा का कोई स्मृति प्रबंधन नहीं होगा।

2

शायद इससे निपटने का अनुमोदित तरीका आपके के साथ उपयोग करने के लिए अपना basic_stringbuf ऑब्जेक्ट बनाना होगा। इसके लिए, आपके पास कुछ विकल्प हैं। एक निश्चित आकार के बफर का उपयोग करना होगा, और overflow बस विफल हो जाएगा जब आप आउटपुट बनाने की कोशिश करते हैं जो बहुत लंबा है। बफर के रूप में एक वेक्टर का उपयोग करने की एक और संभावना होगी। Std :: स्ट्रिंग के विपरीत, वेक्टर गारंटी देता है कि डेटा जोड़ने से निरंतर जटिलता कम हो जाएगी। यह बफर से डेटा कभी भी जारी नहीं करता है जब तक कि आप इसे मजबूर नहीं करते हैं, इसलिए यह आमतौर पर आपके द्वारा किए जा रहे अधिकतम आकार तक बढ़ेगा। उस बिंदु से, इसे तब तक आवंटित या मुक्त स्मृति नहीं देना चाहिए जब तक कि आप उस स्ट्रिंग को नहीं बनाते जो वर्तमान में उपलब्ध लंबाई से परे है।

+0

मैंने एसटीएल कार्यान्वयन के स्रोत की जांच की है जिसका उपयोग मैं कर रहा हूं, अगर मैं इसे ओस्ट्रिंगस्ट्रीम कन्स्ट्रक्टर को स्ट्रिंग पास करता हूं तो यह केवल उस स्ट्रिंग की एक प्रति बनाता है ... –

+0

हां, मैं इसकी अपेक्षा करता हूं। मैं अपनी खुद की स्ट्रिंगबफ ऑब्जेक्ट बनाने और इसे स्ट्रीम करने की सलाह देना चाहता हूं। –

+0

यदि आप उपयोग में एक बफर पास करना चाहते हैं ostrstream ostringstream – Mark

1

std::ostringsteam एक सुविधा इंटरफ़ेस है। यह कस्टम std::streambuf प्रदान करके को std::ostream पर लिंक करता है। आप अपने स्वयं के std :: streambuf को कार्यान्वित कर सकते हैं। यह आपको संपूर्ण स्मृति प्रबंधन करने की अनुमति देता है। आपको अभी भी std::ostream का अच्छा स्वरूपण मिलता है, लेकिन आपके पास स्मृति प्रबंधन पर पूर्ण नियंत्रण है। बेशक, परिणाम यह है कि आपमें अपना स्वरूपित आउटपुट प्राप्त करते हैं - लेकिन यदि आप एम्बेडेड डेवलपर हैं तो शायद यह कोई बड़ी समस्या नहीं है।

+0

यह ट्यूटोरियल एक कस्टम std :: streambuf http://www.mr-edd.co को लागू करने के लिए सहायक था। .uk/ब्लॉग/beginners_guide_streambuf –

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

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