2010-11-22 13 views
9

संभव डुप्लिकेट:
c difference between malloc and callocपसंद करते हैं malloc calloc से अधिक

वहाँ किसी भी स्थिति है जहाँ आप calloc से अधिक malloc पसंद करेंगे है। मैं जानता हूं कि मॉलोक और कॉलोक दोनों गतिशील रूप से स्मृति आवंटित करते हैं और कॉलक आवंटित स्मृति में सभी बिट्स को शून्य तक भी प्रारंभ करता है। इससे मुझे लगता है कि मैलोक पर कॉलोक का उपयोग करना हमेशा बेहतर होगा। या क्या ऐसी कुछ स्थितियां हैं जहां मॉलोक बेहतर है? प्रदर्शन हो सकता है?

+0

इसे फिर से खोलने के लिए वोटिंग। दूसरा सवाल मतभेदों के बारे में है। यह सवाल अलग है। यह पूछता है कि क्यों कोई मॉलोक पसंद करेगा (जो एक आम प्रथा है)। –

+0

@ रेमंडहेटिंगर, अगर मुझे सही याद है, इससे कोई फर्क नहीं पड़ता कि उनके उत्तर समान हैं। –

उत्तर

19

यदि आपको डायनामिक रूप से आवंटित स्मृति को शून्य-प्रारंभिक होने की आवश्यकता है तो calloc का उपयोग करें।

यदि आपको डायनामिक रूप से आवंटित स्मृति को शून्य-प्रारंभिक होने की आवश्यकता नहीं है, तो malloc का उपयोग करें।

आपको हमेशा शून्य-प्रारंभिक स्मृति की आवश्यकता नहीं है; अगर आपको शून्य-प्रारंभिक मेमोरी की आवश्यकता नहीं है, तो इसे शुरू करने की लागत का भुगतान न करें। उदाहरण के लिए, यदि आप स्मृति आवंटित करते हैं और फिर आवंटित स्मृति को भरने के लिए तुरंत डेटा कॉपी करते हैं, तो शून्य-प्रारंभ करने के लिए कोई कारण नहीं है।

calloc और malloc ऐसे कार्य हैं जो विभिन्न चीजें करते हैं: जो भी कार्य पूरा करने की आवश्यकता है, उसके लिए जो भी सबसे उपयुक्त है उसका उपयोग करें।

+0

धन्यवाद। प्रदर्शन एक अच्छा बिंदु है। मुझे यह जानने में भी दिलचस्पी थी कि क्या कोई अन्य संभावित कारण है। – user514946

+1

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

2

कॉलोक के शून्य-प्रारंभिकरण पर निर्भर होना खतरनाक हो सकता है यदि आप सावधान नहीं हैं। ज़ीरोइंग मेमोरी अभिन्न प्रकारों के लिए 0 और उम्मीद के अनुसार चार प्रकार के लिए 0 देता है। लेकिन यह जरूरी नहीं है कि फ्लोट/डबल 0 या न्यूल पॉइंटर्स के अनुरूप हों।

0

आप सामान्य रूप से वहां कुछ संग्रहीत करने के विशिष्ट उद्देश्य के साथ स्मृति आवंटित कर रहे हैं। इसका मतलब है (कम से कम अधिकांश) जो स्थान शून्य-प्रारंभिक है calloc द्वारा जल्द ही अन्य मूल्यों के साथ ओवरराइट किया जाएगा। इस प्रकार, अधिकांश कोड malloc का उपयोग बिना किसी अतिरिक्त गति के अतिरिक्त गति के लिए करता है।

लगभग calloc के लिए मैंने देखा है कि एकमात्र उपयोग कोड था (माना जाता है) सी ++ के सापेक्ष जावा की गति को बेंचमार्क करना था। सी ++ संस्करण में, इसने calloc के साथ कुछ मेमोरी आवंटित की, फिर मेमोरी को फिर से शुरू करने के लिए memset का उपयोग किया (मुझे क्या लगता था) जावा के अनुकूल परिणामों के उत्पादन में काफी पारदर्शी प्रयास।

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