2010-10-01 14 views
31

क्या गठबंधन सूचक पर स्मृति ब्लॉक आवंटित करने के लिए जीसीसी या ग्लिब में कोई मानकीकृत कार्य है? एमएसवीसी में _align_malloc() की तरह?गठबंधन malloc()?

+0

stdlib केवल संस्करण http://stackoverflow.com/questions/227897/how-to-allocate-aligned-memory-only-using- मानक-पुस्तकालय –

उत्तर

4

यह इस बात पर निर्भर करता है कि आप किस तरह के संरेखण की अपेक्षा करते हैं। क्या आप एक कठोर संरेखण चाहते हैं, या अधिक आराम से संरेखण चाहते हैं?

malloc परिभाषा के अनुसार एक सूचक को वापस करने की गारंटी है जो सी प्रोग्राम में किसी मानक प्रकार को संग्रहीत करने के लिए सही ढंग से गठबंधन किया गया है (और इसलिए, मानक प्रकार से निर्मित किसी भी प्रकार)। क्या यह आप की तलाश में है? या आपको कुछ अलग चाहिए?

+15

एक आम पी रॉबलेम यह है कि सिम प्रकार (जैसे एसएसई वैक्टर) को "मानक प्रकार" नहीं माना जाता है, और इसलिए उनके पास 'malloc' प्रदान करने की तुलना में कठोर संरेखण आवश्यकताएं होती हैं। – jalf

+0

ऐसा करने का एक और कारण प्रदर्शन है।डेटा संरचना को संरेखित करके, यह 'n + 1' L1 कैश लाइनों के बजाय' n' को फैलाता है जो आम तौर पर 4096 बाइट या आकार में होते हैं, आपको औसत पर तेज़ स्मृति पहुंच मिलती है। कुछ अनुप्रयोगों के लिए, ऑडियो प्रोसेसिंग कहें, जहां बफर एल 1 कैश लाइन का आकार होता है, या उस आकार का एक छोटा सा हिस्सा, इससे बड़ा अंतर हो सकता है। – nitro2k01

+2

@ नाइट्रो 2k01: कैश लाइनें बहुत छोटी हैं उदा। Amd64 पर x86 और 64 पर 32। पेज ओटीओएच 4k हैं। – diapir

19

[posix_memalign()] [1] समारोह स्मृति आवंटन गठबंधन प्रदान करता है और glibc 2.1.91 बाद से उपलब्ध है।

लेकिन जरूरी नहीं कि अन्य compilers के साथ: के हवाले से मानक "। Posix_memalign() फ़ंक्शन सलाहकार सूचना विकल्प का हिस्सा है और सभी कार्यान्वयन पर उपलब्ध कराई होने की जरूरत नहीं"

24

के बाद से प्रश्न पूछा गया था, एक नया कार्य C11 द्वारा मानकीकृत किया गया:

void *aligned_alloc(size_t alignment, size_t size); 

और यह glibc में उपलब्ध (खिड़कियों पर नहीं के रूप में तक मुझे पता है) है। यह memalign के विपरीत क्रम में अपने तर्क लेता है, माइक्रोसॉफ्ट के _aligned_malloc के विपरीत, और उसी free फ़ंक्शन को सामान्य रूप से उपयोग करने के लिए उपयोग करता है।

7

वहाँ _mm_malloc और _mm_free जो 86/64 दुनिया के सबसे compilers द्वारा समर्थित हैं कर रहे हैं, के साथ कम से कम:

  • जीसीसी
  • MinGW (जीसीसी Win32/win64)
  • MSVC
  • बजना
  • आईसीसी

एक FAIK, ये फ़ंक्शन बिल्कुल मानक नहीं हैं। लेकिन यह मेरे ज्ञान के लिए सबसे समर्थित है। अन्य कार्य अधिक संकलक विशिष्ट हैं:

  • _aligned_malloc MSVC और MinGW केवल
  • POSIX memalign कार्यों में कम से कम MSVC

वहाँ भी C11 मानक कार्य हैं द्वारा समर्थित नहीं हैं है लेकिन दुर्भाग्य से वे नहीं कर रहे हैं सी ++ 11, और सी ++ में उन्हें शामिल करने के लिए गैर मानक प्रीप्रोसेसर परिभाषित करता है ...

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