2012-01-19 15 views
6

हाय सब जब एक सरणी सूची कार्यान्वयन लेखन, मैं समझता हूँ कि यह शून्य करने के लिए Item(x) स्थापित करने के लिए जब यह इतनी के रूप में मेमोरी लीक को रोकने के लिए (बस quantity -= 1 के बजाय) निकाल दिया जाता है महत्वपूर्ण है।"गैर-शून्य" प्राइमेटिव के सरणी को अधिक मेमोरी की आवश्यकता होती है?

हालांकि, अगर मेरी सरणी सूची एक आदिम int सरणी सूची है (int[] द्वारा समर्थित), तो क्या इसे 0 पर सेट करने का अर्थ है?

सिमिलरी, आदिम वर्णों की एक सरणी सूची (char[] द्वारा समर्थित) के लिए, जब RemoveRange() कहा जाता है, तो क्या यह \u0000 के साथ उस सीमा को भरने के लिए समझ में आता है? या यह length और बैकिंग सरणी को संशोधित किए बिना पॉइंटर्स को अपडेट करने के लिए बस ठीक है?

ints की एक सरणी शून्य से भरा है संभवतः कम स्मृति-कब्जे पूर्णांक मूल्यों से भर क्योंकि क्रम अनुकूलन कर सकता है एक समान लंबाई सरणी से?

+0

अगर मैं सही ढंग से याद, यह एक का जवाब थोड़ा विसंगत है। मैं किसी को स्पष्टीकरण करने के लिए समझदार बनूंगा क्योंकि मेरी याददाश्त इस विषय पर बहुत आलसी है। – Esko

+0

झूठी पुष्टि करने के लिए यह बहुत मोहक है कि एक int [] जितना बड़ा होगा उतना बड़ा होगा। क्या कुछ लोगों के पास कोई मॉडल नहीं है कि कंप्यूटर कैसे काम करता है? – Ingo

+0

@Ingo मैं सोच रहा था अनुकूलन किया जा सकता है अगर वे थे सभी एक ही मूल्य (यानी 0) – Pacerier

उत्तर

7

क्या ज़ीरो से भरे इन्ट्स की एक सरणी संभवत: पूर्ण स्मृति-पूर्णांक से बराबर लंबाई सरणी से अधिक स्मृति-कब्जा कर रही है?

दोनों मामलों में मानते हुए हम int[] - संख्या से निपट रहे हैं। एक ही प्रकार के दो सरणी और एक ही लंबाई हमेशा एक ही मात्रा में स्मृति पर कब्जा कर लेगी।

कोई जरूरत 0. के साथ अपने "अब खाली" सरणी तत्वों अधिलेखित करने के लिए यह (एक छोटे से प्रदर्शन लाभ से परे) कोई नुकसान नहीं करते नहीं है, और यहां तक ​​कि चीजें सरल जब डिबगिंग कर सकते हैं, लेकिन तुम नहीं करने की जरूरत है।

1

नहीं, आदिम प्रकारों (यानी उन्हें 0 पर सेट करें) के साथ ऐसा करने की आवश्यकता नहीं है क्योंकि एकमात्र कारण "स्लॉट" स्पष्ट रूप से बाहर निकलते हैं, जिससे उन्हें नकली संदर्भों को रोकने के लिए कचरा संग्रह से घिरा हुआ होता है।

1

आप एक ArrayList<int> है और न ही किसी अन्य कंटेनर पुरातन साथ वर्ग नहीं हो सकता। सादे सरणी के बारे में, जॉन स्कीट्स जवाब देखें।

+1

मुझे पूरा यकीन है कि वह जानता है और वह अपने स्वयं के गैर-जेनेरिक 'ऐरेलिस्ट' वर्ग को 'IntArrayList'' बनाना चाहता है। –

+0

+ संजय - मुझे इतना यकीन नहीं है। वैसे भी, मुझे जवाब देना नहीं चाहिए कि किसी का क्या अर्थ हो सकता है, लेकिन जवाब देने के लिए उसने क्या पूछा। – Ingo

+1

मैंने इसे पढ़ा क्योंकि वह अपनी खुद की सरणी सूची लागू कर रहा है (ArrayList का उपयोग नहीं कर रहा है)। – wmorrison365

1

प्रिमिटिव और संदर्भ हमेशा अंतरिक्ष के एक ही राशि पर कब्जा।

2

... जब एक सरणी सूची कार्यान्वयन लेखन, मैं समझता हूँ कि यह null को Item(x) स्थापित करने के लिए जब यह इतनी के रूप में मेमोरी लीक को रोकने के लिए (बस quantity -= 1 के बजाय) निकाल दिया जाता है महत्वपूर्ण है।

यह सच नहीं है। null को चर की स्थापना कुछ हमेशा जरूरी और ऐसा न करने का मतलब यह नहीं है कि आप एक स्मृति रिसाव है कि है कि नहीं है।

हालांकि, अगर मेरी सरणी सूची एक आदिम int सरणी सूची है, तो क्या इसे 0 पर सेट करना समझ में आता है?

नहीं है, पुरातन के लिए यह नहीं है बात बिल्कुल, 0 या \u0000 (एक चार के लिए) किसी भी अन्य मूल्य की तरह एक मूल्य है। यह कम जगह नहीं लेता है।

+1

यह * है * यदि आप एक 'ArrayList' की तरह प्रकार हालांकि लागू कर रहे हैं। यदि मैं कोई आइटम जोड़ता हूं और फिर सूची से उस तत्व को हटा देता हूं, तो मैं नहीं चाहता कि संदर्भ किसी भी कारण से सूची में लटक रहा हो। –

+0

यदि आप अपनी याददाश्त का प्रबंधन कर रहे हैं तो आपको उपयोग न करने वाली वस्तुओं को प्रबंधित करना होगा। यदि नहीं तो जीसी उस वस्तु को आगे बढ़ाता है अगर उस वस्तु को और अधिक रेफरी नहीं होती है (कुछ अनिर्दिष्ट समय पर)। – wmorrison365

+1

@ जोन्स स्केट हां, यदि आप अपनी खुद की 'सूची' लागू कर रहे हैं तो शायद यह एक अच्छा विचार है। हालांकि बहुत से लोग सोचते हैं कि सामान्य रूप से 'शून्य' पर चर बदलना एक अच्छा विचार है (बिल्कुल समझने के बिना)। मेरी राय में, आपको चीजों को सिर्फ इसलिए नहीं करना चाहिए क्योंकि आपके पास एक अस्पष्ट विचार है कि यह "अच्छा" है - अगर आप समझते हैं तो केवल ऐसा ही करें। – Jesper

1

नहीं, आप सरणी रिसाव को रोकने के लिए वस्तु स्लॉट को रद्द करने की जरूरत है। यदि ऑब्जेक्ट को अभी भी आपके सरणी द्वारा संदर्भित किया गया है तो यह GC'd नहीं हो सकता है - इसलिए लीक जिसे आप संदर्भित करते हैं।दूसरी ओर

प्रिमिटिव स्टैक पर वैसे भी आवंटित किए जाते हैं, ढेर नहीं है, तो वैसे भी GC'd नहीं कर रहे हैं। प्राइमेटिव्स जो क्लास के उदाहरण वर्र्स प्रासंगिक ऑब्जेक्ट के फ़ील्ड के रूप में संग्रहीत होते हैं और ऑब्जेक्ट GC'd होने पर साफ़ हो जाते हैं।

साथ ही, JLS इंगित करता है कि एक आदिम का आकार वी एम-विशिष्ट होता है लेकिन सबसे (सभी?) VMs वर्तमान में 4byte ints समर्थन करते हैं। अधिक जानकारी के लिए JLS देखें: