2013-03-18 14 views
20

हैं मैं "मजबूत सूचक" और "कमजोर सूचक" की धारणा के साथ उलझन में हूँ। डायने Hackborn खुद कहा कि:क्या मजबूत संकेत और कमजोर संकेत

वस्तु के आसपास है, जबकि वहाँ मजबूत संकेत दिए गए हैं रहेगा; यह एक बार अंतिम रिलीज होने के बाद नष्ट हो गया है। आप कमजोर सूचक के साथ तुलना कर सकते हैं तुलनात्मक और मजबूत सूचक को बढ़ावा देने का प्रयास कर रहा है; बाद में असफल हो जाएगा यदि ऑब्जेक्ट पर कोई अन्य मजबूत पॉइंटर्स नहीं हैं।

कौन सा मेरे लिए काफी स्पष्ट नहीं है। क्या एक मजबूत सूचक एक (boost::) साझा सूचक के बराबर है? और एक कमजोर सूचक की भूमिका क्या है यदि वह सिर्फ एक मजबूत सूचक को बढ़ावा देने का प्रयास करने के लिए है? जैसे, हमें कमजोर और मजबूत पॉइंटर्स की आवश्यकता कब होती है?

अद्यतन:

आप हर किसी को धन्यवाद, लेकिन मैं एंड्रॉयड के कर्नेल sp और wp के बारे में विशेष रूप से पूछ रहा हूँ, और वे सभी पर जावा के संदर्भ के साथ कोई लेना देना नहीं है।

असल में मैं यहाँ http://www.androidenea.com/2010/03/share-memory-using-ashmem-and-binder-in.html कोड दरार करने के कोशिश कर रहा हूँ और वास्तव में sp के उपयोग और समझ में नहीं आता wp

अद्यतन:

वास्तविक जवाब स्वीकार किए जाते हैं की टिप्पणी में निहित है जवाब। Gabe Sechan के लिए धन्यवाद:

मजबूत और कमजोर संकेत दिए गए विभिन्न स्मार्ट सूचक कार्यान्वयन इतने लंबे समय के रूप में कम से कम एक मजबूत सूचक संदर्भ में यह कर रहे हैं और एक ही बात के बारे में करते हैं जब एक सूचक क्षेत्र से बाहर चला जाता है, ऐसा नहीं होगा मुक्त हो जाओ यदि केवल कमजोर पॉइंटर्स (या कुछ भी नहीं) संदर्भ होंगे। चेक किया जाता है जब भी इसका एक मजबूत या कमजोर संदर्भ उतर जाता है।

यदि मेरे पास एक ही ऑब्जेक्ट का संदर्भ देने वाले 10 कमजोर पॉइंटर्स हैं, और में से कोई 10 गुंजाइश से बाहर हो जाता है, तो वस्तु नष्ट हो जाएगी? जबकि मजबूत पॉइंटर्स के साथ, केवल तभी जब उनमें से सभी 10 गुंजाइश से बाहर हो जाएंगे तो ऑब्जेक्ट नष्ट हो जाएगा?

हाँ, लगभग। यदि आप केवल इतना है 10 कमजोर संकेत है, यह शायद क्षेत्र से बाहर पहले से ही चला गया होता, जब पिछले मजबूत सूचक दायरे से बाहर चला गया। कार्यान्वयन यह एक छोटे के आसपास लंबे समय तक है, जबकि रहना हो, तो अतिरिक्त स्मृति की अनुमति दे सकता है, लेकिन यह कटा हुआ हो जाएगा अगर आप एक कम स्मृति हालत में जाना है और इसे नहीं लग उनके कार्यान्वयन की तरह है कि उसकी बोली से उन्नत है। और इस के उपयोग अभी भी मुख्य रूप से यह मोटे तौर पर एक बढ़ावा shared_ptr के बराबर है caching- और weak_ptr को बढ़ावा देने है। तो मूल रूप से, एक कमजोर सूचक में ऑब्जेक्ट हो सकता है, यह संदर्भ किसी भी समय दूर हो जाता है।

+0

असल में मैं वैसे भी एंड्रॉयड के कर्नेल ताकि कोई जावा प्रोग्रामिंग कर रहा हूँ, धन्यवाद इस अवधारणा – miller

उत्तर

7

एंड्रॉइड जावा में प्रोग्राम किया जाना है, सी नहीं। एंड्रॉइड टीम का कोई भी दस्तावेज उस भाषा का संदर्भ देगा। जावा में मजबूत और कमजोर संदर्भ हैं।एक कमजोर संदर्भ कचरा कलेक्टर को इसे साफ करने से नहीं रोकता है, एक मजबूत संदर्भ करता है। इन्हें कुछ ओएस पर कैशिंग के लिए उपयोग किया जाता है, लेकिन 3.0 के रूप में एंड्रॉइड पर ऑब्जेक्ट के केवल कमजोर संदर्भों का मतलब है कि इसे तुरंत एकत्र किया जाएगा। के रूप में यह कोई कचरा संग्रहण है

सी, एक कमजोर संदर्भ का कोई बराबर है।

+4

की व्याख्या करने के प्रयास के लिए +1। –

+5

तो फिर तुम :-) – fedepaol

+0

कमजोर या मजबूत संदर्भ में रुचि मुझे यह करने के लिए हरा @fedepaol नहीं होना चाहिए ... – Simon

22

एसपी एंड्रॉयड में इसका मतलब है StrongPointer, यदि संदर्भ गिनती के बराबर होती है करने के लिए 0. WP मतलब है WeakPointer स्मृति कि उठाई वस्तु के कब्जे में मुक्त हो जाएगा, इसलिए यदि मैं एक कमजोर सूचक है, मुझे परवाह नहीं है कि क्या संदर्भित वस्तु जीवित है या नहीं। इसका उपयोग कुछ कैश और तुलना परिदृश्यों में किया जा सकता है।

पहले, StrongPointer.h में एसपी कार्यान्वयन पर एक त्वरित नज़र रखना।

यह बस संदर्भ गिनती के लिए एक आवरण है। उदाहरण के लिए,

template<typename T> template<typename U> 
sp<T>& sp<T>::operator = (U* other) 
{ 
    if (other) ((T*)other)->incStrong(this); 
    if (m_ptr) m_ptr->decStrong(this); 
    m_ptr = other; 
    return *this; 
} 

आप sp<IBinder> strongPointer द्वारा एक मजबूत सूचक बनाते हैं, तो m_ptr संदर्भित वस्तु है। यदि आप स्रोत कोड में देख सकते हैं, एसपी टेम्पलेट केवल कि सिस्टम स्मृति के रूप में लंबे समय के रूप में मैं इस एसपी पकड़ खाली नहीं होगा तो एक मजबूत सूचक का प्रतिनिधित्व करता है। यह एक संदर्भ काउंटर बनाए रखता है। काउंटर RefBase कक्षा में बनाए रखा जाता है। और स्ट्रॉन्गॉइंटर का उपयोग करने के लिए, आपके ओबीजे को रेफबेस का उदाहरण होना चाहिए।

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

आप एक व्यापक रूप से देख सकते हैं एंड्रॉयड ढांचे में StrongPointers का उपयोग करता है, उनमें से ज्यादातर IBinder वस्तु पर कर रहे हैं, एक देशी बांधने की मशीन वस्तु विभिन्न प्रक्रियाओं के माध्यम से पारित कर सकते हैं। विभिन्न प्रक्रियाएं एक ही ऑब्जेक्ट पर मजबूत पॉइंटर्स रख सकती हैं, तब तक ऑब्जेक्ट को सिस्टम द्वारा निरस्त नहीं किया जाएगा जब तक कि एक प्रक्रिया अभी भी पॉइंटर धारण न करे।

+0

क्लास 'sp' संदर्भ गणना को क्यों बनाए रखता है जैसे' std :: shared_pointer' करता है? इस तरह की जिम्मेदारियों को विभाजित करने का क्या फायदा है? – Adrian

+0

इसे उत्तर के रूप में चिह्नित किया जाना चाहिए ... –

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