2016-10-13 8 views
13

क्या कोई मुझे बता सकता है कि Rc<>Copy नहीं है?std :: rc :: आरसी <> कॉपी क्यों नहीं है?

मैं कोड लिख रहा हूं जो बहुत से साझा पॉइंटर्स का उपयोग करता है, और .clone() टाइप करने के लिए हर समय मेरे नसों पर हो रहा है।

ऐसा लगता है कि Rc<> में केवल एक सूचक शामिल होना चाहिए, जो एक निश्चित आकार है, इसलिए प्रकार Sized और इसलिए Copy होना चाहिए, है ना?

क्या मुझे कुछ याद आ रही है?

उत्तर

20

मुझे ऐसा लगता है कि Rc<> बस, एक सूचक है, जो एक निश्चित आकार है से मिलकर चाहिए ताकि प्रकार ही है, Sized और इसलिए Copy होना चाहिए ना?

यह बिल्कुल सही नहीं है। Rcआर वरीयता सी के लिए छोटा है। इसका अर्थ यह है कि इस प्रकार का ट्रैक ट्रैक करता है कि कितने संदर्भ स्वामित्व वाले डेटा को इंगित करते हैं। इस तरह हम एक साथ कई मालिकों है और सुरक्षित रूप से डेटा मुक्त, एक बार संदर्भ गिनती 0.


तक पहुँच जाता है लेकिन हम संदर्भ काउंटर वैध और नवीनतम जानकारी रखना कर सकते हैं? वास्तव में, जब भी कोई नया संदर्भ/मालिक बनाया जाता है और जब भी कोई संदर्भ/स्वामी हटा दिया जाता है तो हमें कुछ करना पड़ता है। विशेष रूप से, हमें पूर्व मामले में काउंटर को बढ़ाना होगा और बाद में इसे कम करना होगा।

काउंटर को Drop, जंगली के विनाश के बराबर लागू करके कम किया गया है। यह drop() फ़ंक्शन निष्पादित किया जाता है जब भी एक चरणीय दायरे से बाहर हो जाता है - हमारे लक्ष्य के लिए बिल्कुल सही।

लेकिन हम वृद्धि कब करते हैं? आपने अनुमान लगाया: clone() में। The Copy trait, परिभाषा हो, का कहना है कि एक प्रकार बस को कॉपी बिट्स द्वारा दोहराया जा सकता है:

प्रकार कि बस को कॉपी बिट्स से कॉपी किया जा सकता है (यानी memcpy)।

यह हमारे मामले में सच नहीं है, क्योंकि: हाँ, हम "बिट्स कॉपी करें", लेकिन हम अतिरिक्त काम भी करते हैं! हमें हमारे संदर्भ काउंटर को बढ़ाने की जरूरत है!

4

एक प्रकार Copy लागू नहीं कर सकते अगर यह लागू करता Drop (source)। चूंकि Rcdoes implement it इसकी संदर्भ गणना को कम करने के लिए, यह संभव नहीं है।

इसके अलावा, Rc सिर्फ एक सूचक नहीं है।यह एक Shared के होते हैं:

pub struct Rc<T: ?Sized> { 
    ptr: Shared<RcBox<T>>, 
} 

कौन सा, बारी में, एक सूचक नहीं है:

pub struct Shared<T: ?Sized> { 
    pointer: NonZero<*const T>, 
    _marker: PhantomData<T>, 
} 

PhantomDataT के मालिकाना हक को व्यक्त करने की जरूरत है:

इस मार्कर है भिन्नता के लिए कोई परिणाम नहीं, लेकिन यह समझने के लिए ड्रॉपक के लिए आवश्यक है कि हम तर्कसंगत रूप से T के स्वामी हैं।

जानकारी के लिए, देखें: https://github.com/rust-lang/rfcs/blob/master/text/0769-sound-generic-drop.md#phantom-data

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