संरेखित malloc
posix_memalign
है, यह ठीक है, लेकिन realloc
पर गठबंधन के बारे में क्या है? क्या realloc
संरेखण को बनाए रखता है या कैसे आश्वस्त किया जाता है कि पुन: आवंटित स्मृति में एक ही संरेखण है? लिनक्स और x86_64 मान लें।क्या realloc posix_memalign की मेमोरी संरेखण रखता है?
उत्तर
नहीं, realloc
posix_memalign
से लौटाई गई मेमोरी पर या तो उसी संरेखण को बनाए रखने के लिए आईएसओ या पॉज़िक्स द्वारा गारंटी नहीं है। realloc
बस उसी पते पर वर्तमान ब्लॉक का विस्तार कर सकता है लेकिन यह ब्लॉक को एक अलग पते पर भी ले जा सकता है जिसका संरेखण मूल से कम सख्त है।
यदि आप एक ही संरेखण चाहते हैं, तो शायद यह एक और ब्लॉक आवंटित करना और डेटा को कॉपी करना सबसे अच्छा है।
दुर्भाग्य से, एकल यूनिक्स विशिष्टता में कोई भी posix_memalign_realloc
फ़ंक्शन नहीं है।
आप डेटा हर समय को कॉपी करने की परेशानी के माध्यम से जाना नहीं चाहते हैं, तो आप की कोशिश कर सकते realloc
(क) और, अगर उस के संरेखण के रूप में नहीं की उम्मीद थी, तो और उसके बाद कॉल सही ढंग से गठबंधन पता पाने के लिए posix_memalign
पर कॉल करें और डेटा को वहां कॉपी करें, पुराने पते को पूरा करते समय मुक्त करें।
इस में हो सकता है:
- शून्य प्रतियां (वर्तमान ब्लॉक में जगह विस्तारित किया जा सकता है),
- एक प्रति (यदि
realloc
प्रतियां लेकिन आपको सही ढंग से गठबंधन ब्लॉक देने के लिए होता है); या - दो प्रतियां (यदि
realloc
प्रतियां और फिर आपको गलत संरेखण के कारण प्रतिलिपि बनाना होगा)।
यह भी कम नकल में हो सकता है की तुलना में अंतर्निहित स्मृति प्रबंधन कार्यान्वयन के आधार पर संकेत दिया। उदाहरण के लिए, एक "प्रतिलिपि" में भौतिक रूप से डेटा को स्थानांतरित करने के बजाय मेमोरी ब्लॉक को रीमेप करना शामिल हो सकता है।
तो आप कुछ आंकड़े रखना चाहेंगे कि यह योजना सार्थक है या नहीं।
(क) बस है कि न तो POSIX है और न ही लिनक्स आदमी पृष्ठों को निर्दिष्ट किया जाए या नहीं आप भी realloc
करने के लिए इन संकेत पारित कर सकते हैं, केवल कि आप उन्हें free
को पारित कर सकते हैं को ध्यान में रखना।
हालांकि, मौजूदा जीएनयू libc सोर्स कोड पर आधारित है, यह काम करने के लिए प्रकट होता है, हालांकि कि कोई गारंटी नहीं है, यह मानक संरेखण भविष्य में काम करने के लिए :-)
मुझे डर था कि यह स्मृति सामान्य रूप से आवंटित होगा जारी रहेगा () और एक ऑफ़सेट पता वापस भेज दें (यानी, एक्टॉल पता आवंटित नहीं किया गया है, लेकिन उससे परे N
बाइट्स) जो free
अपने जादू को बुनाई से पहले वास्तविक पते में वापस जाने के लिए पर्याप्त बुद्धिमान था।
ऐसा करने का एक तरीका वास्तविक पते को तुरंत पते से पहले स्टोर करना होगा, हालांकि यह निश्चित रूप से नियमित आवंटन के लिए भी बर्बाद हो जाएगा।
उस मामले में, free
बुद्धिमान बनाई हो सकती है (के बाद से चश्मा कहते हैं कि यह आवंटन posix_memalign
द्वारा किया संभाल करने में सक्षम होना चाहिए), लेकिन realloc
ही खुफिया नहीं दिया गया है हो सकता है (के बाद से डॉक्स कि इस मामले पर चुप हैं)।
हालांकि, जीएनयू ग्लिब 2.14.1 के आधार पर, यह वास्तव में आवश्यकतानुसार अधिक स्मृति आवंटित करता है, फिर पूर्व-स्थान और पोस्ट-स्पेस को खाली करने के लिए क्षेत्र के साथ झुकाव, ताकि पता भेजा गया पता "वास्तविक" पता है, free
या realloc
द्वारा प्रयोग योग्य।
लेकिन, जैसा कि कहा गया है, दस्तावेज इसकी गारंटी नहीं देता है।
यह उत्तर एक महत्वपूर्ण तरीके से सही नहीं है: रीयलॉक आमतौर पर प्रतिलिपि नहीं करता है भले ही स्मृति क्षेत्र चलता है। मुझे लगता है कि यदि बफर का विस्तार करने के लिए वर्तमान मेमोरी पते पर पर्याप्त जगह नहीं है - तो प्रतिलिपि से बचने के लिए पृष्ठों को रीमेप किया जाता है। तो यह शून्य प्रतियां, शून्य प्रतियां, एक प्रतिलिपि होगी। –
@ राफेलबैप्टिस्टा, आप * मानकों के साथ * कुछ * कार्यान्वयन * को भ्रमित कर रहे हैं। * मानकों (आईएसओ/पीओएसईक्स) में * कुछ नहीं * है जो अनिवार्य है कि कवर के तहत चीजें कैसे होती हैं। हालांकि, ऐसा प्रतीत होता है कि लिनक्स को मानने के मेरे जवाब के बाद प्रश्न बदल दिया गया था जो कुछ हद तक मैदान को संकुचित करता है (लेकिन आप सोच सकते हैं कि लिनक्स संभवतः जंगली रूप से भिन्न एमएमयू विकल्पों के साथ हार्डवेयर की एक बड़ी विविधता पर चलता है)। सूट के जवाब को समायोजित करेगा। – paxdiablo
realloc malloc के समान व्यवहार करता है, इसलिए realloc द्वारा लौटाई गई स्मृति में malloc का एक ही संरेखण बाधा है।
यदि आप रीयलोक के लिए glibc स्रोत कोड देखते हैं, तो यह सीधे मॉलोक पर कॉल करता है। तो स्मृति malloc के रूप में उसी तरह गठबंधन है।
क्षमा करें, मुझे जोड़ना चाहिए। स्रोत में, यदि पहले से ही मूल malloc'd स्मृति द्वारा इंगित स्थान में अतिरिक्त ढेर स्थान है तो यह malloc को कॉल किए बिना मूल आवंटन आकार के अंत में अतिरिक्त ढेर आवंटित करता है। यह स्पष्ट रूप से संरेखण नहीं बदलेगा। –
- 1. realloc
- 2. जावा मेमोरी आवंटन संरेखण
- 3. realloc
- 4. अपाचे को मेमोरी में ऑफ़सेट क्यों रखता है जहां php-cli वर्चुअल मेमोरी पतों रखता है?
- 5. आधुनिक प्रोसेसर पर मेमोरी संरेखण?
- 6. Realloc() विंडोज
- 7. इंटरलाक्ड एक्सचेंज और मेमोरी संरेखण
- 8. क्या memcpy() realloc() का उपयोग करता है?
- 9. "स्टैक संरेखण" क्या है?
- 10. क्या मायने रखता है।
- 11. 32-बिट इंटेल प्रोसेसर पर मेमोरी संरेखण
- 12. बनाम रिलीज नहीं के बराबर एक वस्तु की स्थापना + realloc
- 13. realloc() और एआरसी
- 14. मेमोरी एक्सेस की लागत क्या है?
- 15. क्या बफर कम हो रहा है जब realloc जगह में होने की गारंटी है?
- 16. क्या संरेखण HeapAlloc का उपयोग करता है
- 17. क्या डीएलएल आकार मायने रखता है?
- 18. क्या वालराय में संगत स्मृति संरेखण है?
- 19. क्या pushViewController नियंत्रक को बनाए रखता है?
- 20. क्या NSNotification ऑब्जेक्ट को बनाए रखता है?
- 21. एसएसई वेक्टरेशन और मेमोरी संरेखण के बीच संबंध
- 22. आंतरिक फ्लैश मेमोरी में सी संरचना का संरेखण
- 23. "मेमोरी स्टॉम्प" क्या है?
- 24. संरेखण अपमानजनक क्यों है?
- 25. एसटीएल वेक्टर realloc का एक बेहतर संस्करण है?
- 26. GetHashCode() क्यों मायने रखता है?
- 27. .NET स्ट्रिंग मान कहां रखता है?
- 28. शब्द संरेखण को समझना
- 29. क्या View.removeAllViews() रिलीज मेमोरी है?
- 30. cuda संरेखण 256bytes गंभीरता से?
नहीं - अगर आपको किसी विशेष संरेखण की आवश्यकता है उदा। सिम डेटा के लिए, फिर realloc का उपयोग न करें। –
तो, अगर मुझे "गठबंधन रीयलोक" की ज़रूरत है, तो मुझे मुफ्त और posix_memalign नई मेमोरी चाहिए, है ना? – Cartesius00
हां - यदि आप वास्तव में चाहते थे तो आप अपने स्वयं के 'posix_memrealloc' को भी इस तरह कार्यान्वित कर सकते हैं। –