एक समाधान आपके sprintf
को लागू करने के लिए हो सकता है जो रिंग बफर के साथ काम करने में सक्षम है। दुर्भाग्य से यह आपको अधिक बुनियादी समस्या के बारे में मदद नहीं करेगा: यदि आपका रिंगबफर भरा हुआ है और आप sprintf
का आह्वान करते हैं तो आप क्या करेंगे?
अपनी स्मृति स्थिति इसे बर्दाश्त कर सकते हैं, मैं इस समस्या के लिए एक समाधान का सुझाव चाहते हैं:
विचार बफ़र्स की दोनों आपस में जुड़े सूचियों के आधार पर किया जाता है (मुक्त बफ़र्स के लिए एक सूची, संचारित कतार के रूप में एक सूची) । बफर समान आकार के होते हैं ताकि वे सबसे खराब केस लंबाई स्ट्रिंग स्टोर कर सकें। बफर एक साधारण ढेर बनाते हैं जहां आवंटन/डीलोकेशन केवल मुक्त या ट्रांसमिशन सूची से तत्व को निकालने/निकालने के लिए होता है।
बराबर आकार के बफर होने की गारंटी देता है कि आप गतिशील रूप से स्मृति आवंटित करते समय "चेकरबोर्डिंग" जैसे बाहरी विखंडन प्रभावों से ग्रस्त नहीं हैं। इस नौकरी के लिए अपना खुद का ढेर बनाना आपको ट्रांसमिशन कार्यों के लिए उपलब्ध कुल बफर आकार पर पूर्ण नियंत्रण भी देगा।
मैं इस प्रकार यह चल रहा है कल्पना कर सकता:
- आप में डेटा प्रस्तुत करने के लिए नि: शुल्क सूची से एक बफर आवंटित।
- अपने कार्यों प्रस्तुत करना (suchas sprintf) का उपयोग बफर में डेटा प्रस्तुत करने के लिए
- आंकड़ा संचरण कतार में भेजे जाने के लिए संलग्न (और यदि आवश्यक हो एक संचरण गति प्रदान)
डीएमए के लिए आप के लिए स्थानांतरण ट्रांसफर एंड आईआरक्यू को संभालें। वहां आप बफर को "मुक्त सूची" में स्थानांतरित कर देते हैं और कतार में अगले बफर के लिए स्थानांतरण सेट करते हैं।
यह समाधान स्मृति कुशल नहीं होगा लेकिन रनटाइम दक्षता अच्छी है क्योंकि आप केवल एक बार स्मृति को लिखते हैं और आवंटन/डीलोकेशन केवल पॉइंटर को कहीं भी ला रहा है/संग्रहीत कर रहा है। बेशक आपको यह सुनिश्चित करना होगा कि आपको अपने आवेदन और आईआरक्यू के आवंटन/डीलोकेशन के लिए दौड़ की स्थिति नहीं मिलती है।
शायद यह विचार आपको अपनी आवश्यकताओं को हल करने के लिए एक प्रेरणा देता है।
दिलचस्प आवश्यकता है, लेकिन मुझे नहीं लगता कि आप 'अस्थायी उचित प्रतिलिपि समारोह द्वारा परिपत्र बफर के लिए नकल के बाद बफर में प्रारूप' काफी की तुलना में बेहतर करने के लिए जा रहे हैं है। –