यह एक विखंडन की तरह लगता है। विखंडन आप ढेर पर वस्तुओं का आवंटन के कारण होता है, कहते हैं:
object1
object2
object3
object4
और फिर कुछ वस्तुओं
object1
object3
object4
को हटाने
अब आपके पास स्मृति में एक छेद है जो अप्रयुक्त है। यदि आप एक और वस्तु आवंटित करते हैं जो छेद के लिए बहुत बड़ा है, तो छेद बर्बाद हो जाएगा। आखिरकार पर्याप्त स्मृति मंथन के साथ, आप इतने सारे छेदों के साथ समाप्त हो सकते हैं कि वे आपको स्मृति बर्बाद कर देते हैं।
इसके आसपास का तरीका आपकी स्मृति आवश्यकताओं को आगे बढ़ाने और तय करने का तरीका है। यदि आपके पास विशेष वस्तुएं हैं जो आप जानते हैं कि आप कई बना रहे हैं, तो कोशिश करें और सुनिश्चित करें कि वे एक ही आकार के हैं।
आप आवंटन को किसी विशेष वर्ग के लिए अधिक कुशल बनाने के लिए पूल का उपयोग कर सकते हैं ... या कम से कम आपको इसे बेहतर ट्रैक करने दें ताकि आप समझ सकें कि क्या हो रहा है और एक अच्छे समाधान के साथ आना है।
ऐसा करने का एक तरीका यह एक भी स्थिर बनाने के लिए है:
struct Slot
{
Slot() : free(true) {}
bool free;
BYTE data[20]; // you'll need to tune the value 20 to what your program needs
};
Slot pool[500]; // you'll need to pick a good pool size too.
सामने पूल बनाएं जब अपने कार्यक्रम शुरू होता है और पूर्व आवंटित यह इतना है कि यह अपने कार्यक्रम के लिए अधिकतम आवश्यकताओं के रूप में के रूप में बड़ा है । आप इसे हेपअलोक करना चाहते हैं (या अपने ओएस में समकक्ष ताकि आप कहीं भी एप्लिकेशन स्टार्टअप में दिखाई देने पर नियंत्रण कर सकें)।
फिर नए को ओवरराइड करें और एक संदिग्ध वर्ग के लिए ऑपरेटर हटाएं ताकि वे इस वेक्टर से स्लॉट वापस कर सकें। तो, आपकी वस्तुएं इस वेक्टर में संग्रहित की जाएंगी।
आप इस वेक्टर में एक ही आकार के वर्गों के लिए नए ओवरराइड कर सकते हैं और हटा सकते हैं।
विभिन्न वस्तुओं के लिए विभिन्न आकारों के पूल बनाएं।
बस सबसे खराब अपराधी के लिए जाएं।
मैंने पहले ऐसा कुछ किया है और यह एक एम्बेडेड डिवाइस पर मेरी समस्या हल कर चुका है। मैं भी बहुत सारे एसटीएल का उपयोग कर रहा था, इसलिए मैंने एक कस्टम आवंटक बनाया (एसएलएल कस्टम आवंटक के लिए Google - लिंक के भार हैं)। यह मेरे प्रोग्राम का उपयोग किए गए मिनी-डेटाबेस में संग्रहीत रिकॉर्ड्स के लिए उपयोगी था।
क्या आपके पास कोई कोड है जो अलग है? क्या यह वास्तव में समान है? यदि अंतर नहीं है तो क्या अंतर है। बस कुछ त्वरित विचार। –
मुझे लगता है कि आपका मतलब है: 50 केबी * मुफ्त * से शुरू होता है? – MSalters
हां, यह 50 केबी के साथ शुरू होता है। हां, कुछ मंच विशिष्ट कोड भी हैं। लेकिन, मैंने इसे लक्ष्यीकरण प्रणाली पर चलाते समय अक्षम कर दिया। लेकिन, अभी भी एक ही मुद्दा है। – Ajay