2017-08-04 21 views
18

कई गठबंधन संस्करण मौजूद सम्मानित malloc() की, उदा .:क्या वास्तव में realloc() संरेखण का समर्थन करने का कोई संस्करण नहीं है?

#include <stdlib.h> 
int posix_memalign(void **memptr, size_t alignment, size_t size); 
void *aligned_alloc(size_t alignment, size_t size); 

#include <malloc.h> 
void *memalign(size_t alignment, size_t size); 

(POSIX, glibc और लिनक्स libc क्रमशः में उद्भव)। लेकिन - मुझे realloc() के संस्करण का कोई उल्लेख नहीं दिख रहा है जो संरेखण का समर्थन करता है। क्या यह वास्तव में कभी लागू नहीं किया गया है? गठबंधन malloc() रूपों में स्मृति के गठबंधन खंड की खोज के साथ गैर-गठबंधन realloc() की कार्यक्षमता को गठबंधन करना बहुत छोटा लगता है।

संबंधित:

Does realloc keep the memory alignment of posix_memalign?

+0

हां। कई कारणों से कोई नहीं है। एक यह है कि आवंटित आवंटित कार्य गठित ब्लॉक के डेटा आकार के बारे में जानकारी नहीं सहेजते हैं और डेटा की कोई प्रति संभव नहीं है। यह एप्लिकेशन डेवलपर को छोड़ दिया गया था। इसके कई कारण थे, कई वर्षों पहले बहुत सक्रिय रूप से चर्चा की गई - विवरण –

+3

@ पीटरजे के लिए उपयुक्त मेलिंग सूची अभिलेखागार देखें: क्या आप कह रहे हैं कि गठबंधन आवंटन फ़ंक्शंस 'malloc() 'सेव की तुलना में _less_ जानकारी को सहेजते हैं? मुझे बहुत संदेह है ... वैसे भी, अगर आप इसे और अधिक मांस कर सकते हैं, तो उस चर्चा के कुछ लिंक के साथ बेहतर, कृपया एक उत्तर पोस्ट करें। – einpoklum

+0

कम नहीं। फोरम के लिए विषय बहुत जटिल है। स्पष्टीकरण के लिए मेलिंग सूची अभिलेखागार ब्राउज़ करें। –

उत्तर

3

संरेखित realloc केवल _aligned_realloc समारोह के साथ माइक्रोसॉफ्ट में कार्यान्वित किया जाता। कोई पॉज़िक्स संस्करण परिभाषित नहीं है और लिनक्स में कोई कार्यान्वयन नहीं है। मैंने कभी नहीं समझा क्यों, क्योंकि यह glibc में कोड के लिए इतना जटिल प्रतीत नहीं होता है। मुझे लगता है कि व्यापक सिम निर्देशों के आगमन पर विचार करने से पहले इसे लागू करने से पहले समय की बात है।

फिलहाल, गठबंधन स्मृति का एक नया ब्लॉक आवंटित करें, सामग्री की प्रतिलिपि बनाएँ और पुराने सूचक को मुक्त करें। यह वैसे भी आपके आवेदन को धीमा नहीं करना चाहिए।

+2

यदि आप अंतिम को छोड़ देते हैं तो आपको +1 कर देगा वाक्य, मैं उस अनजान नहीं हूं ... भी, यदि संभव हो तो हम आधिकारिक स्रोत चाहते हैं। – einpoklum

+2

या तो आपके पास अपना स्वयं का मेमोरी पूल है और आप अपने स्वयं के गठबंधन रीयलोक को कार्यान्वित कर सकते हैं, या तो आप memalign + memcpy + free का उपयोग कर सकते हैं, या तो आप एक अधिक सहायक उत्तर की प्रतीक्षा कर सकते हैं क्योंकि आप "उस अनजान नहीं हैं"। – yakoudbz

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