सी ++, फ्री-स्टोर बनाम ढेर


124

new/deleteकहा जाता है कि फ्री-स्टोर पर डायनेमिक एलोकेशन होता है ,
जबकि malloc/freeऑपरेशन हीप का इस्तेमाल करते हैं

मैं जानना चाहूंगा कि क्या व्यवहार में वास्तविक अंतर है।
क्या कंपाइलर दो शब्दों के बीच अंतर करते हैं? ( फ्री स्टोर और ढेर , नहीं new/malloc)

जवाबों:


76

Http://www.gotw.ca/gotw/009.htm देखें ; यह ढेर और फ्री-स्टोर के बीच के अंतरों का वर्णन कर सकता है जो मैं कर सकता हूं:

नि: शुल्क की दुकान:

मुफ्त स्टोर दो गतिशील मेमोरी क्षेत्रों में से एक है, जिसे नए / हटाए गए द्वारा आवंटित / मुक्त किया गया है। ऑब्जेक्ट जीवनकाल उस समय से कम हो सकता है जब भंडारण आवंटित किया जाता है; वह यह है कि, मुफ्त स्टोर ऑब्जेक्ट्स को तुरंत आरम्भ किए बिना मेमोरी आवंटित की जा सकती है, और मेमोरी को बिना डील किए हुए तुरंत नष्ट किया जा सकता है। उस अवधि के दौरान जब भंडारण आवंटित किया जाता है, लेकिन ऑब्जेक्ट के जीवनकाल के बाहर, भंडारण को एक शून्य के माध्यम से एक्सेस और हेरफेर किया जा सकता है। ।

ढेर:

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


23
मैं असहमत हूं। गतिशील आवंटन के संदर्भ में "हीप" शब्द का उपयोग न तो C ++ मानक और न ही C99 द्वारा किया जाता है (मेरे पास C89 नहीं है, जिसे C ++ संदर्भित करता है, मुझे बेझिझक इसे सही करें यदि यह शब्द का उपयोग करता है)। मुझे वह तारीख नहीं मिल रही है, जब प्रश्न में GotW प्रकाशित हुआ था, लेकिन चूंकि यह मसौदे के बारे में बात करता है, यह स्पष्ट रूप से पूर्व-मानक है।
अवकर

2
यह शब्दावली, इम्हो का सवाल है। कहो, श्री। स्ट्रॉस्ट्रुप 'हीप' और 'फ्री स्टोर' में अंतर नहीं करता है: stroustrup.com/Programming/17_free_store.ppt , स्लाइड 12. 'हीप' का उपयोग डायनेमिक मेमोरी के पर्यायवाची के रूप में बहुत पहले ++ से पहले किया गया था, चूंकि लिस्प समय (1960) स्मृति आवंटन के लिए ढेर डेटा संरचना।
एलेक्सी वायटनको

मैं आम तौर पर 'कच्चे' सामग्री आपूर्तिकर्ता के एक प्रकार के रूप में हीप (मालॉक / मुफ्त के माध्यम से) के बारे में सोचता हूं। आप स्मृति का एक हिस्सा है कि आप इसे मिल कोई तामझाम के लिए पूछें। आपको स्वयं कोई संरचना बनानी होगी। फ्री स्टोर (नया / डिलीट) एक 'तैयार माल' आपूर्तिकर्ता की तरह है। आप एक वस्तु के लिए पूछते हैं और इसे कुछ स्थान आवंटित किया जाता है, और यह आपके द्वारा उपयोग किए जाने के लिए तैयार और तैयार की गई वस्तु। जब यह समाप्त हो जाता है तो यह अच्छी तरह से साफ हो जाता है।
अंशुमान कुमार

67

C ++ के लिए, फ्री स्टोर और हीप के बीच का अंतर विशुद्ध रूप से वैचारिक है। कीड़े इकट्ठा करने के लिए एक जार की तरह, और कुकीज़ को इकट्ठा करने के लिए एक। एक को एक तरह से लेबल किया जाता है, दूसरे को। यह पदनाम घर को उस बिंदु पर चलाने के लिए है जिसे आप " new" और " delete" " malloc", " realloc", या " free" (या उस मामले के लिए बिट स्तर सेट) के साथ मिलाते हैं ।

साक्षात्कार के दौरान यह कहना अच्छा है कि " newऔर deleteमुफ्त स्टोर का उपयोग करें, mallocऔर freeढेर का उपयोग करें; newऔर deleteनिर्माणकर्ता और विध्वंसक को क्रमशः कॉल करें, हालांकि mallocऔर freeनहीं।" फिर भी, आप अक्सर सुनते होंगे कि मेमोरी सेगमेंट वास्तव में एक ही क्षेत्र में होते हैं - हालाँकि, यह संकलक विशिष्ट हो सकता है, यह कहना है, यह संभव है कि दोनों अलग-अलग मेमोरी स्पेस को पूल के रूप में नामित कर सकते हैं (यह निश्चित नहीं है कि यह क्यों होगा, हालांकि)।


28

माइक कोवल का जवाब सिद्धांत को काफी अच्छी तरह से कवर करता है। व्यवहार में, हालांकि, वे लगभग हमेशा स्मृति के समान क्षेत्र होते हैं - ज्यादातर मामलों में यदि आप संकलक के कार्यान्वयन में खोदते हैं new, तो आप कॉल पाएंगे malloc()

दूसरे शब्दों में: मशीन के दृष्टिकोण से, ढेर और मुफ्त स्टोर एक ही बात है। संकलक के अंदर भेद मौजूद है।

चीजों को और अधिक भ्रमित करने के लिए, C ++ के आगमन से पहले हमने कहा कि "ढेर" का अर्थ है जिसे अब "फ्री स्टोर" कहा जाता है।


5

"हीप" शब्द एक विशेष डेटा संरचना को भी संदर्भित कर सकता है, लेकिन सी ++ मॉलोक के संदर्भ में, नि: शुल्क, नया, और ऑपरेशनों को हटा दें "हीप" और "फ्री स्टोर" का उपयोग अधिक या कम परस्पर विनिमय के लिए किया जाता है।


3

ढेर और फ्री-स्टोर को इंटरऑपरेबल नहीं माना जाता है। C ++ 11 मानक लाइब्रेरी के साथ AVR 8-बिट माइक्रो नियंत्रकों की तरह विवश संदर्भों में, वे एक ही कार्यक्रम में भी उपयोग नहीं किए जा सकते हैं। नि: शुल्क स्टोर और हीप एक ही मेमोरी स्पेस में अपने आवंटन करते हैं, एक दूसरे संरचनाओं और डेटा को ओवरराइट करते हैं। इस संदर्भ में, फ्री स्टोर हीप के साथ अलग और असंगत है क्योंकि "मॉलॉक / फ्री / रियललॉक / कॉलोक हीप लाइब्रेरी" की तुलना में "नया / डिलीट फ्री स्टोर लाइब्रेरी" सरल (और तेज) है और इस तरह से मेमोरी मेमोरी का भारी लाभ मिलता है। सी ++ एम्बेडेड प्रोग्रामर (एक संदर्भ में जहां आपके पास केवल 512 बाइट्स रैम है)।

8-बिट c ++ 11/14 मानक पुस्तकालय देखें Https://github.com/ambroise-leclerc/ETL/tree/master/libstd देखें


2

मुझे याद है कि मानक कभी भी ढेर शब्द का उल्लेख नहीं करता है, सिवाय push_heapएट अल जैसे कार्यों के विवरण के । सभी गतिशील आवंटन फ्री-स्टोर पर किए जाते हैं।


1

फ्री स्टोर एक ऐसे प्रोग्राम को दिया गया है जो प्रोग्राम के निष्पादन के दौरान डायनेमिक एलोकेशन के लिए उपयोग किया जाता है। हर कार्यक्रम को अन-आवंटित हीप मेमोरी के एक पूल के साथ प्रदान किया जाता है जिसे वह निष्पादन के दौरान उपयोग कर सकता है। उपलब्ध मेमोरी के इस पूल को प्रोग्राम के फ्री स्टोर के रूप में जाना जाता है। आवंटित मुक्त स्टोर मेमोरी अनाम है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.