मुझे कैसे पता चलेगा कि ढेर ढेर पर है? [डुप्लिकेट]

Nov 27 2020

जंग में विभिन्न प्रकार के बहुत सारे हैं; मुझे कैसे पता चलेगा कि ढेर ढेर पर है?

कहो कि क्या मैंने २० स्तरों के ढांचे को घोंसला बनाया था, और हर स्तर में स्टैक डेटा होता है, लेकिन २० के स्तर पर एक ढेर बॉक्स होता है, क्या इसका मतलब यह है कि पूरा पेड़ अब ढेर पर है?

और क्या होगा अगर उस रूट पर जो कि संरचना ढेर पर एक बॉक्स के अंदर है - क्या सभी स्टैक आधारित डेटा अब ढेर में चले गए हैं?

क्या इस ढेर बनाम ढेर तर्क का निरीक्षण करने के लिए उपकरण हैं?

जवाब

3 Masklinn Nov 27 2020 at 20:42

जंग में विभिन्न प्रकार के बहुत सारे हैं; मुझे कैसे पता चलेगा कि ढेर ढेर पर है?

यदि कोई इसे ढेर पर रखता है, तो यह ढेर पर नहीं है।

कहो कि क्या मैंने २० स्तरों के ढांचे को घोंसला बनाया था, और हर स्तर में स्टैक डेटा होता है, लेकिन २० के स्तर पर एक ढेर बॉक्स होता है, क्या इसका मतलब यह है कि पूरा पेड़ अब ढेर पर है?

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

अन्य आम ढेर संकेत दिए गए हैं Rc, Arc, String, या Vec। और निश्चित रूप से अन्य जटिल संरचनाएं हैं जो ढेर पर अपना काम करती हैं, जैसे कि वास्तव में संकेत HashMapऔर उदाहरण के लिए बिना पॉइंटर्स के ।

और क्या होगा अगर उस रूट पर जो कि संरचना ढेर पर एक बॉक्स के अंदर है - क्या सभी स्टैक आधारित डेटा अब ढेर में चले गए हैं?

हाँ। चूंकि बाकी संरचना "रूट" के अंदर "है", आप पूरी चीज को बॉक्स करते हैं।

क्या इस ढेर बनाम ढेर तर्क का निरीक्षण करने के लिए उपकरण हैं?

ज़रुरी नहीं। एलोकेटर्स को ट्रेस करने या डिबगिंग सपोर्ट जैसे कुछ एलोकैटर्स (जैसे हीमॉलोक में हीप प्रोफाइलिंग) जैसे उपकरण हैं, जो आपको, अच्छी तरह से, ढेर आवंटन का पता लगाते हैं। लेकिन ये सब आपको बता सकते हैं कि बाइट्स की कुछ राशि आवंटित की गई है, न कि उन बाइट्स बिल्कुल क्या हैं, और आप केवल यह जान पाएंगे कि ढेर आवंटन कटौती से नहीं हुआ है कि कोई भी आवंटन नहीं हुआ है।

2 PeterHall Nov 27 2020 at 21:07

लिनक्स पर, आप के साथ ढेर उपयोग प्रोफ़ाइल कर सकते हैं valgrindऔर massifऔर साथ परिणामों को देखने के ms_print

पहले कार्यक्रम की रूपरेखा तैयार करें:

$ valgrind --tool=massif ./target/debug/my_program 
==32006== Massif, a heap profiler
==32006== Copyright (C) 2003-2017, and GNU GPL'd, by Nicholas Nethercote
==32006== Using Valgrind-3.15.0 and LibVEX; rerun with -h for copyright info
==32006== Command: ./target/debug/my_program
==32006==

रिपोर्ट को एक फ़ाइल में लिखा जाता है जिसका नाम massif.out.<pid>(जहाँ pidप्रक्रिया आईडी है) जिसे आप देख सकते हैं ms_print। प्रक्रिया आईडी के ऊपर के उदाहरण में 32006 है, इसलिए इसे देखें:

$ ms_print massif.out.32006

आपको बहुत सारी जानकारी मिल जाएगी, लेकिन यह आपको इंगित करेगा कि ढेर आवंटन कैसे होते हैं, स्टैक के निशान के साथ जो उन्हें ले जाते हैं।