2012-01-31 13 views
12

संरेखित mallocposix_memalign है, यह ठीक है, लेकिन realloc पर गठबंधन के बारे में क्या है? क्या realloc संरेखण को बनाए रखता है या कैसे आश्वस्त किया जाता है कि पुन: आवंटित स्मृति में एक ही संरेखण है? लिनक्स और x86_64 मान लें।क्या realloc posix_memalign की मेमोरी संरेखण रखता है?

+2

नहीं - अगर आपको किसी विशेष संरेखण की आवश्यकता है उदा। सिम डेटा के लिए, फिर realloc का उपयोग न करें। –

+0

तो, अगर मुझे "गठबंधन रीयलोक" की ज़रूरत है, तो मुझे मुफ्त और posix_memalign नई मेमोरी चाहिए, है ना? – Cartesius00

+1

हां - यदि आप वास्तव में चाहते थे तो आप अपने स्वयं के 'posix_memrealloc' को भी इस तरह कार्यान्वित कर सकते हैं। –

उत्तर

15

नहीं, reallocposix_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 द्वारा प्रयोग योग्य।

लेकिन, जैसा कि कहा गया है, दस्तावेज इसकी गारंटी नहीं देता है।

+0

यह उत्तर एक महत्वपूर्ण तरीके से सही नहीं है: रीयलॉक आमतौर पर प्रतिलिपि नहीं करता है भले ही स्मृति क्षेत्र चलता है। मुझे लगता है कि यदि बफर का विस्तार करने के लिए वर्तमान मेमोरी पते पर पर्याप्त जगह नहीं है - तो प्रतिलिपि से बचने के लिए पृष्ठों को रीमेप किया जाता है। तो यह शून्य प्रतियां, शून्य प्रतियां, एक प्रतिलिपि होगी। –

+0

@ राफेलबैप्टिस्टा, आप * मानकों के साथ * कुछ * कार्यान्वयन * को भ्रमित कर रहे हैं। * मानकों (आईएसओ/पीओएसईक्स) में * कुछ नहीं * है जो अनिवार्य है कि कवर के तहत चीजें कैसे होती हैं। हालांकि, ऐसा प्रतीत होता है कि लिनक्स को मानने के मेरे जवाब के बाद प्रश्न बदल दिया गया था जो कुछ हद तक मैदान को संकुचित करता है (लेकिन आप सोच सकते हैं कि लिनक्स संभवतः जंगली रूप से भिन्न एमएमयू विकल्पों के साथ हार्डवेयर की एक बड़ी विविधता पर चलता है)। सूट के जवाब को समायोजित करेगा। – paxdiablo

1

realloc malloc के समान व्यवहार करता है, इसलिए realloc द्वारा लौटाई गई स्मृति में malloc का एक ही संरेखण बाधा है।

0

यदि आप रीयलोक के लिए glibc स्रोत कोड देखते हैं, तो यह सीधे मॉलोक पर कॉल करता है। तो स्मृति malloc के रूप में उसी तरह गठबंधन है।

+0

क्षमा करें, मुझे जोड़ना चाहिए। स्रोत में, यदि पहले से ही मूल malloc'd स्मृति द्वारा इंगित स्थान में अतिरिक्त ढेर स्थान है तो यह malloc को कॉल किए बिना मूल आवंटन आकार के अंत में अतिरिक्त ढेर आवंटित करता है। यह स्पष्ट रूप से संरेखण नहीं बदलेगा। –

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