8

सामान्य कंटेनरों (जैसे कि क्यूटी के कंटेनरों में पाया गया) के लिए लिखने के कार्यान्वयन पर एक साझा स्मृति/प्रतिलिपि है जो सी ++ 11 चाल अर्थशास्त्र और रावल संदर्भों से अधिक है?साझा स्मृति और लिखने या rvalue संदर्भों पर प्रतिलिपि और semantics ले जाएँ?

कहाँ एक असफल होता है, और दूसरे को सफल? या वे विकल्प के बजाय पूरक हैं?

उत्तर

7

दोनों लिखने पर कॉपी और ले जाने के अर्थ विज्ञान वस्तुओं है कि ढेर पर अपने डेटा पकड़ का मूल्य अर्थ विज्ञान का अनुकूलन करने के लिए इस्तेमाल किया गया है। std::string, उदाहरण के लिए एक कॉपी-ऑन-राइट ऑब्जेक्ट, और एक चाल-सक्षम ऑब्जेक्ट के रूप में लागू किया गया है।

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

एसटीडी में कंटेनरों की सभी :: lib अब चाल अर्थ विज्ञान का उपयोग करें और यहां तक ​​कि std::string है, जो प्रति-ऑन-राइट का उपयोग करने की अनुमति दी जानी थी, अब ऐसा करने से मना किया है। अगर मैं आज एक नया ग्राहक कंटेनर लिख रहा था, तो मैं कॉपी-ऑन-राइट चुनने से पहले मूव सेमेन्टिक्स का उपयोग करूंगा।

अभी भी कॉपी-ऑन-लिखने में सी ++ 11 के लिए एक प्रयोग है। यदि आप उम्मीद करते हैं कि आपकी डेटा संरचना को शायद ही कभी लिखा जा सकता है, लेकिन अक्सर प्रतिलिपि बनाई जाती है, वही मूल्य की प्रतियां रखने वाले कई ग्राहकों के साथ, कॉपी-ऑन-राइट अभी भी एक बड़ी जीत हो सकती है।

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

+0

उदाहरण में कॉपी-ऑन-राइट सेमेन्टिक्स को भरना संभव होगा एक आवंटक? निश्चित रूप से आवश्यक होने पर आवंटक का उपयोग करने के लिए इंटरफ़ेस फ़ंक्शंस को संशोधित करके। मुझे संदेह है कि std :: आवंटक के पास आवश्यक इंटरफ़ेस है हालांकि? – rubenvb

6

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

प्रतिलिपि के साथ लिखने से अधिक ऑब्जेक्ट पर कि एक ही समय में जीवित हैं सामग्री सामग्री साझा करें। चाल semantics के साथ समय में एक विशेष बिंदु में सामग्री केवल एक वस्तु है।

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

+0

वर्तमान में मैं कंटेनर के कार्यान्वयन लिखने पर एक प्रति के लिए देख रहा हूँ, क्योंकि वे लंबी ताले से बचने के लिए एक बहु-क्रम वातावरण में किया जाता है। मेरे मामले में मेरे पास एक मास्टर कंटेनर और कई इटरेटर हैं जो इसकी सामग्री को सुरक्षित रूप से फिर से सक्रिय करने में सक्षम होना चाहिए। परमाणु संदर्भ गिनती के साथ लिखने पर प्रतिलिपि मेरे लिए काम करेगी। – Keinstein

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