मैं वर्तमान में विंडोज के तहत malloc()
कार्यान्वयन में देख रहा हूं। लेकिन मेरे शोध में मैंने उन चीजों पर ठोकर खाई है जो मुझे परेशान करते हैं:विंडोज मेमोरी आवंटन प्रश्न
सबसे पहले, मुझे पता है कि एपीआई स्तर पर, विंडोज़ ज्यादातर HeapAlloc()
और VirtualAlloc()
कॉल को आवंटित करने के लिए कॉल का उपयोग करती है। मैं here से इकट्ठा करता हूं कि माइक्रोसॉफ्ट कार्यान्वयन malloc()
(जिसे सीआरटी - सी रनटाइम में शामिल किया गया है) मूल रूप से ब्लॉक> 480 बाइट्स के लिए HeapAlloc()
पर कॉल करता है और अन्यथा विखंडन को रोकने के लिए छोटे आवंटन के लिए VirtualAlloc()
के साथ आवंटित एक विशेष क्षेत्र का प्रबंधन करता है।
ठीक है कि यह सब अच्छा और अच्छा है। लेकिन फिर malloc()
के अन्य कार्यान्वयन हैं, उदाहरण के लिए nedmalloc, जो माइक्रोसॉफ्ट के malloc
से 125% तेज होने का दावा करता है।
क्यों नहीं हम सिर्फ छोटे ब्लॉकों के लिए
HeapAlloc()
कॉल कर सकते हैं:सभी यह मेरे लिए कुछ चीजें आश्चर्य बनाता है? विखंडन के संबंध में खराब प्रदर्शन करता है (उदाहरण के लिए "सर्वश्रेष्ठ-फिट" के बजाय "प्रथम-फिट" करके)?
- वास्तव में, किसी भी तरह से पता है कि विभिन्न एपीआई आवंटन कॉल की हुड के नीचे जा रहा है है? यह काफी उपयोगी होगा।
क्या है माइक्रोसॉफ्ट के
malloc
सेnedmalloc
तो बहुत तेजी से?ऊपर से, मैं धारणा है कि
HeapAlloc()
/VirtualAlloc()
इतनी धीमी गति से है कि यह बहुतmalloc()
के लिए तेजी से होता है एक समय में केवल एक बार उन्हें फोन करने के लिए और उसके बाद आबंटित स्मृति में ही प्रबंधन करने के लिए कर रहे हैं मिला है। क्या यह धारणा सच है? याmalloc()
"रैपर" सिर्फ विखंडन के कारण आवश्यक है? कोई ऐसा सोचता है कि इस तरह की प्रणाली कॉल जल्दी होगी - या कम से कम कुछ विचार उन्हें कुशल बनाने के लिए रखे गए होंगे।- यदि यह सच है, तो ऐसा क्यों है?
औसत पर, कितने स्मृति (परिमाण के एक आदेश) पढ़ता है/लिखने एक ठेठ
malloc
कॉल (शायद पहले से ही आवंटित खंडों की संख्या के एक समारोह) द्वारा किया जाता है? मैं सहजता से कहता हूं कि यह औसत कार्यक्रम के लिए दसियों में है, क्या मैं सही हूँ?
एक तरफ, "dlmalloc" पर पढ़ना malloc रणनीतियों के बारे में बहुत जानकारीपूर्ण है – Will