2012-10-12 9 views
8

संभव डुप्लिकेट:
c difference between malloc and calloc
Why does calloc require two parameters and malloc just one?सी कार्यों में "एनएमईएम" और "आकार" पैरामीटर रखने की क्या आवश्यकता है?

मैं कई सी कार्यों के साथ यह ध्यान दिया है विशेष रूप से जो कि स्मृति या फ़ाइल आपरेशनों के साथ सौदा कहता है, लेकिन उन सभी को दोनों का उपयोग मापदंडों। उदाहरण के लिए malloc एक पैरामीटर पारित किया गया है, मेमोरी स्पेस के बाइट्स में आकार की आवश्यकता है। दूसरी तरफ कैलकोक दो मानकों को पारित किया जाता है, तत्व के बाइट्स में आकार और तत्वों की संख्या (आकार और एनएमईएम)। ऐसे अन्य कार्य भी हैं जो इन आकारों और एनएमईएम पैरामीटर का भी उपयोग करते हैं।

मूलतः calloc कॉल malloc बुला (nmem आकार) के रूप में स्मृति का एक ही राशि आवंटित जाएगा, ताकि वह सब वास्तव में क्या हो रहा है तारांकित () एक अल्पविराम (,) के साथ बदल दिया जाता है। कम से कम यह सब मैं उच्च स्तर से बता सकता हूं कि मैं काम कर रहा हूं। मुझे कॉलोक कॉल करने में कोई फर्क नहीं पड़ता (1, एनएमई आकार), कॉलोक (एनएमई आकार, 1), या कॉलोक (एनएमईएम, आकार)।

क्या वास्तव में निम्न स्तर पर कुछ ऐसा हो रहा है जो उदाहरण कॉलक (1, एनएमईएम * आकार) को कॉलोक (एनएमईएम, आकार) से मौलिक रूप से अलग करता है?

संपादित करें: मुझे कॉलोक और मॉलोक के बीच कार्यात्मक अंतर पता है। मुझे दिलचस्पी है कि पैरामीटर में मतभेद क्यों हैं। ऐसे अन्य कार्य हैं जो कुल आकार (फ़्रेड, फ़्राइट, इत्यादि) के लिए 2 आकार पैरामीटर का उपयोग करते हैं। मैं विशिष्ट कार्यों से चिंतित नहीं हूं बल्कि फ़ंक्शन में उपयोग किए जाने वाले कुल आकार के लिए दो पैरामीटर क्यों हैं, जब अनिवार्य रूप से कुल आकार दो मानकों को एक साथ गुणा करता है। मुझे लगता है कि जब मैं इन कार्यों का उपयोग करता हूं, तो मैं उस आकार का उपयोग करता हूं जिसे मुझे "आकार" पैरामीटर में और "एनएमईएम" (कभी-कभी "गिनती" इत्यादि) के लिए '1') की आवश्यकता होती है।

+1

मेमोरी संरेखण सुधार हुआ है "एक अशक्त सूचक (0) वापसी" (प्लेटफार्मों पर जहां यह महत्वपूर्ण है) दो पैरामीटर फॉर्म के साथ। – wallyk

+0

'malloc() 'और' calloc() 'के रूप में आपको यहां एक समेकित अंतर मिलता है: http://stackoverflow.com/a/1585987/694576 ... - वैसे भी, क्या आप हमें अन्य कार्यों पर इंगित करना चाहते हैं , बाद के दो के अलावा, आपको दिमाग में है। – alk

+2

@Paciv यह काफी डुप्लिकेट नहीं है क्योंकि उस प्रश्न और उसके उत्तर पैरामीटर की संख्या में अंतर को संबोधित नहीं करते हैं। –

उत्तर

0

क्या वास्तव में निम्न स्तर पर कुछ ऐसा हो रहा है जो उदाहरण कॉलक (1, एनएमईएम * आकार) को कॉलोक (एनएमईएम, आकार) से मौलिक रूप से अलग करता है?

बातें समझाने के लिए यह प्रयास विशुद्ध रूप से libc कार्यान्वयन से निर्भर है - और एक विशिष्ट libc लेखक की प्रशंसा में इसलिए छोड़ दिया:

calloc() के बाद से स्मृति के शून्यीकरण है, तर्क हो सकता है कि यह कर सकता है (संभावित रूप से) mult करने पर कुछ और चक्र बर्बाद करें।

इसके विपरीत, malloc() को एक सटीक मूल्य का उपयोग करने का मौका दिया जाता है, संभावित रूप से उस कॉल में ओवरहेड को कम करने के लिए जो कि संतुष्ट करने के लिए आसान हो।

यह मत भूलना कि सी को उस समय डिजाइन किया गया था जब प्रत्येक सीपीयू चक्र की लागत बहुत अधिक थी - इसलिए कई अन्य 'उच्च स्तरीय' भाषाओं की तुलना में एक बहुत दुबला डिजाइन।

यह प्रश्न शायद सी डेनिस रिची के लेखक द्वारा बेहतर उत्तर दिया जा सकता है।

+0

डेनिस रिची जल्द ही किसी भी समय सवालों का जवाब नहीं देगी, ouija बोर्ड को छोड़कर ... –

2

प्रश्न पर एक टिप्पणी में, मैंने लिखा है कि calloc() प्लेटफ़ॉर्म के लिए बेहतर मेमोरी संरेखण की अनुमति देता है जहां यह महत्वपूर्ण है। मैं समर्थन करने के लिए कुछ भी नहीं ढूंढ पाया है (अभी तक)। मुझे पूरा यकीन है कि यह वीएमएस/वीएक्ससी कंपाइलर की एक विशेषता थी, लेकिन इसके लिए स्रोत दुर्लभ है।


हालांकि, मैं मिला कि calloc() और alloc() एक ही समय में दिखाई दिया, मई 1975 में यूनिक्स वी 6 की रिहाई वी 5 में साथ, जारी की 11 महीने पहले, न समारोह मौजूद है; कर्नेल और रनटाइम लाइब्रेरी (और असेंबलर और सी कंपाइलर) असेंबली में लिखे गए थे।

वी 6 रिलीज में, calloc is implemented चार लाइन स्रोत कोड मॉड्यूल के रूप में:

calloc(n, s) 
{ 
return(alloc(n*s)); 
} 

calloc() आबंटित स्मृति स्पष्ट नहीं है; alloc() देखें, और वी 6 में calloc() के लिए man पृष्ठ नहीं था; तथापि man page for alloc():

वर्णन
alloc और मुक्त एक सरल सामान्य प्रयोजन कोर प्रबंधन पैकेज प्रदान करते हैं। एलोक बाइट्स में आकार दिया गया है; यह कम से कम उस क्षेत्र में एक सूचक देता है जो भी है और इसलिए किसी भी प्रकार का ऑब्जेक्ट हो सकता है। पर तर्क आवंटन द्वारा पहले आवंटित क्षेत्र के लिए एक सूचक है; यह स्थान आगे आवंटन के लिए उपलब्ध कराया गया है।

कहने की जरूरत नहीं, कब्र विकार अगर अंतरिक्ष alloc द्वारा आवंटित लंघन है परिणाम होगा या कुछ यादृच्छिक संख्या मुक्त करने के लिए सौंप दिया है अगर।

दिनचर्या पहले फिट एल्गोरिदम का उपयोग करता है जो ब्लॉक को अन्य ब्लॉक से पहले से मुक्त किया जा रहा है। यह sbrk (देखें "ब्रेक (II))" सिस्टम से अधिक कोर प्राप्त करने के लिए जब कोई उपयुक्त स्थान पहले से मुक्त नहीं है।

निदान
रिटर्न -1 अगर कोई उपलब्ध मूल है।

BUGS
आवंटित स्मृति में साफ़ होने के बजाय कचरा होता है।

मेमोरी थकावट के मामले में भी NULL वापस नहीं किया गया है!

calloc() पहले औपचारिक रूप से, यूनिक्स V7 जनवरी 1979 में दिखाई देता है कई अन्य improvements के साथ:

  • calloc() स्मृति लौटे साफ करता है।
  • alloc()malloc()
  • realloc() को नाम दिया गया था स्मृति थकावट या एक ढेर गलती की स्थिति में दिखाई दिया
  • , कार्यों
+0

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

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

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