2014-04-15 24 views
16

में कोई गठबंधन कॉलक क्यों नहीं है C11 मानक ने aligned_alloc फ़ंक्शन को अनियंत्रित गठबंधन स्मृति आवंटित करने के लिए जोड़ा। मानक में स्मृति को आवंटित करने के लिए calloc फ़ंक्शन भी शामिल है जो शून्य पर प्रारंभ किया गया है लेकिन केवल इसे सबसे बड़े प्रकार के आकार में संरेखित करता है।सी 11

सी 11 मानक में aligned_calloc फ़ंक्शन शामिल नहीं है जो शून्य की शुरुआत वाली गठबंधन स्मृति आवंटित करता है?

मुझे पता है कि आप केवल आरंभिक मेमोरी प्राप्त करने के लिए परिणाम को याद कर सकते हैं लेकिन calloc फ़ंक्शन कुछ ऑपरेटिंग सिस्टम पर बहुत उपयोगी है क्योंकि कर्नेल द्वारा प्रदान की गई स्मृति को सुरक्षा कारणों से अक्सर पहले ही शून्य प्रारंभ किया जाना चाहिए (और पृष्ठ आकार में गठबंधन किया जाना चाहिए) । calloc इसका उपयोग कर सकते हैं और डबल प्रारंभिकरण से बच सकते हैं।

इसके अतिरिक्त कुछ ऑपरेटिंग सिस्टम (जैसे लिनक्स) कॉपी-ऑन-राइट फैशन में स्मृति प्रदान करते हैं जो calloc के साथ आदिम स्पैस डेटा संरचनाओं को बनाने की अनुमति देता है। aligned_alloc के परिणाम पर प्रारंभिक यादृच्छिकता इस संपत्ति को नष्ट कर देती है।

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

+2

शायद क्योंकि डिजाइन यह तय करने की कला है कि क्या शामिल करना है और क्या छोड़ना है, और यह बार को पूरा नहीं करता है (भले ही संदिग्ध उपयोग के कई कार्यों में)। वैसे भी, इसे प्रदान करने और अगले मानक में शामिल होने से किसी भी कार्यान्वयन को रोकना कुछ भी नहीं है। – Deduplicator

+0

न केवल किसी भी प्रणाली को 'aligned_calloc' प्रदान करने के लिए स्वतंत्र है, लेकिन आप शायद पहले से ही mmap() ing/dev/zero द्वारा कई प्रणालियों पर कार्यक्षमता का अनुकरण कर सकते हैं, जो स्मृति को तत्काल करने का कारण नहीं बनना चाहिए। –

+1

सुनिश्चित करें कि आप ऑलोकेटर का उपयोग करके कस्टम कॉलोक से ऑफसेट लौटकर इसे स्वयं संरेखित कर सकते हैं, लेकिन आप aligned_alloc और posix_memalign आवंटित स्मृति के विपरीत, इसे या mmap स्मृति को मुक्त नहीं कर सकते हैं। लेकिन मैं सोच रहा हूं कि शुद्धता के लिए नए कार्यों की संख्या को कम करने के अलावा ओमिसन का कोई कारण है या नहीं। – jtaylor

उत्तर

9

सर्वोत्तम अनुमान मैं पेशकश कर सकता है कि एक aligned_calloc विशेष रूप से C1X चार्टर की स्पष्ट लक्ष्यों में से एक के खिलाफ जाता है है:

C9X के लिए विपरीत, लंदन बैठक में आम सहमति थी कि वहाँ कोई आविष्कार किया जाना चाहिए बिना अपवाद के। केवल उन्हीं सुविधाओं में जिनके पास इतिहास है और वाणिज्यिक कार्यान्वयन द्वारा उपयोग किए जाने वाले सामान्य हैं। इसके अलावा पर ध्यान देना चाहिए कि इन सुविधाओं को इस तरह मानकीकृत करें जो मानक और वाणिज्यिक कार्यान्वयन संगत बनाएगा।

http://www.open-std.org/JTC1/SC22/wg14/www/docs/n1250.pdf

वाणिज्यिक कार्यान्वयन पर चारों ओर देख रहे हैं, aligned_malloc व्यापक रूप से सबसे हर मंच के लिए उपलब्ध है और आम था। एक गठबंधन कॉलोक को aligned_malloc() + memset() जोड़ी से अधिक प्रदान करने के लिए कई प्लेटफॉर्म पर रैपिंग से अधिक की आवश्यकता होगी, इस प्रकार आविष्कारक माना जा सकता है और इस प्रकार छोड़ा गया था।

यह मेरा सबसे अच्छा अनुमान होगा।

+0

यह एक अच्छा जवाब है, लेकिन बहुत संतोषजनक नहीं है। यह मूल रूप से सवाल पूछता है कि क्यों विशिष्ट प्लेटफ़ॉर्म पहले स्थान पर गैर-मानक API प्रदान नहीं करते हैं। AFAIK, लिनक्स + ग्लिबैक भी ऐसा कार्य प्रदान नहीं करता है। –