2011-08-19 20 views
11

असेंबली भाषाएं स्टैक और ढेर दोनों का उपयोग क्यों करती हैं? वे अनावश्यक लगते हैं।एक ढेर और ढेर क्यों है?

+6

यह एक अच्छा सवाल है, यह पहले ही उत्तर दिया गया है [http://stackoverflow.com/questions/79923/what-and-where-are-the-stack-and-heap) – Lars

+0

... और ए विंडोज पर ध्यान केंद्रित करने वाले समान प्रश्न का उत्तर दिया गया था [http://stackoverflow.com/questions/2422252/windows-assembly-heap-and-stack) (चूंकि दूसरा ओएस-विशिष्ट है, मैं बंद करने के लिए मतदान नहीं कर रहा हूं , लेकिन यह एक करीबी कॉल है)। – eran

उत्तर

12

वे अनावश्यक नहीं हैं। उनमें से प्रत्येक में शक्तियां और कमजोरियां होती हैं: यदि सही उपयोग किया जाता है तो एक ढेर तेज होता है, क्योंकि स्मृति आवंटन छोटा होता है (पुश/पॉप)। नकारात्मकता यह है कि आप केवल शीर्ष पर आइटम जोड़ और निकाल सकते हैं (इसलिए नाम, ढेर)। इसके अलावा, कुल स्टैक स्पेस सीमित है, और जब आप बाहर निकलते हैं, तो आपके पास ... अच्छी तरह से ढेर ओवरफ्लो होता है। इसके विपरीत, ढेर, यादृच्छिक आवंटन और विलोपन की अनुमति देता है, और आप वहां बड़ी मात्रा में डेटा स्टोर कर सकते हैं, लेकिन नकारात्मकता यह है कि आवंटन में अधिक ओवरहेड होता है - स्मृति के प्रत्येक आवंटित ब्लॉक के लिए, एक उपयुक्त मुक्त भाग पाया जाना चाहिए, और लंबे समय तक, मुक्त स्थान के विखंडन से बचा जाना चाहिए, और सिस्टम को ट्रैक करना चाहिए कि मुक्त ब्लॉक कहां हैं।

आप छोटे अल्पकालिक मूल्यों को पारित करने के लिए स्टैक का उपयोग करते हैं, उदाहरण के लिए स्थानीय काउंटर चर, फ़ंक्शन तर्क, वापसी मूल्य, आदि; ये खुद को धक्का/पॉप आवंटन शैली के लिए उधार देते हैं। बड़े या लंबे समय तक रहने वाले डेटा संरचनाओं के लिए, आप ढेर का उपयोग करते हैं।

2

यह मेमोरी हैंडलिंग और प्रबंधन के बारे में है। x86 आर्किटेक्चर के विभिन्न प्रकार के रजिस्ट्रार हैं। x86 आर्किटेक्चर पर हार्डवेयर समर्थित मेमोरी प्रबंधन की संभावनाएं हैं और इसी तरह।

स्टैक का उपयोग निर्देशक सूचक द्वारा किया जाता है, हीप कुछ अनुप्रयोगों में डेटा सेगमेंट के लिए होता है।

अधिक मैं सलाह पढ़ने के लिए आप निम्न लिंक पढ़ें:

"एक स्मृति मॉडल एक संकलक कई महत्वपूर्ण ऑप्टिमाइज़ेशन करने के लिए अनुमति देता है" - विकिपीडिया

3

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

ढेर

स्टैक प्लेटों के ढेर के रूप में सोचा जा सकता है, तो आप एक मूल्य के एक थाली पर लिख सकते हैं और ढेर इस एक धक्का ऑपरेशन कहा जाता है के शीर्ष पर डाल दिया और पर एक मूल्य संग्रहीत करता है ढेर। आप स्पष्ट रूप से स्टैक से शीर्ष प्लेट को भी हटा सकते हैं जिसे इसे पॉप ऑपरेशन कहा जाता है। लेकिन नए आवंटन हमेशा ढेर के शीर्ष पर होना चाहिए।

ढेर स्थानीय चर के लिए और कार्यों के बीच मूल्यों को पारित करने के लिए उपयोग किया जाता है। आम तौर पर ढेर भयानक गुण निम्नलिखित है:

  • संकेत केवल कुछ एक ढेर यह भी तेजी से बनाने के लिए प्रबंधन करने के लिए
  • हार्डवेयर में लागू करने के लिए बहुत आसान है, सबसे अधिक प्रोसेसर हार्डवेयर समर्थन में बनाया गया है की आवश्यकता है।
  • बहुत स्मृति को आबंटित करने

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

आप कह सकते हैं कि ढेर तेजी से अनुक्रमिक स्मृति आवंटन की सुविधा प्रदान करता है।

ढेर

अब ढेर प्रत्येक आवंटन आम तौर पर अलग-अलग ट्रैक है अलग है। यह आवंटन और विध्वंस के लिए बहुत अधिक ओवरहेड का कारण बनता है, लेकिन जब तक आप स्मृति से बाहर नहीं हो जाते, तब तक प्रत्येक को अन्य स्मृति आवंटन से स्वतंत्र रूप से संभाला जा सकता है।

इस पूरा करने के लिए कई एल्गोरिदम कर रहे हैं और यह शायद एक बिट यहाँ उनके बारे में ट्विटर पर करने के लिए बुद्धिमानी नहीं है लेकिन यहाँ एक कड़ी है कि कुछ अच्छा सरल ढेर आवंटन एल्गोरिदम बारे में बात करती है: Alternatives to malloc and new

तो ढेर यादृच्छिक की सुविधा स्मृति आवंटन लेकिन यह रनटाइम जुर्माना के साथ आता है, हालांकि जुर्माना अक्सर छोटा होता है कि अगर आपको केवल स्टैक का उपयोग करके स्थिति को संभालना होता है तो क्या होगा।

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