मैं सिर्फ this अच्छा कॉपी-ऑन-राइट सूचक कार्यान्वयन को देखा। यह बहुत सामान्य और उपयोगी दिखता है, इसलिए मेरा सवाल यह है: क्या ऐसी कक्षा किसी भी सी ++ टूलकिट्स (बूस्ट, लोकी इत्यादि) में निहित है? यदि नहीं, तो मैं वास्तव में जानना चाहता हूं कि क्यों यह वास्तव में उपयोगी मुहावरे है और स्पष्ट रूप से एक सामान्य कार्यान्वयन करने योग्य लगता है (जैसा कि मैंने लिंक किया है)।कोई बढ़ावा नहीं है :: copy_on_write_ptr?
उत्तर
संभावना पर बहुत बहस हुई थी, और auto_ptr
के संदर्भ में कम से कम एक सुझाव दिया गया संस्करण संदर्भ सूचक के लिए था।
दुर्भाग्य से, गाय के लिए समय ज्यादातर बीत चुका है। एक गाय सूचक (या गाय-जो भी) थ्रेड-सुरक्षित बनाना गंभीर performance problems पेश कर सकता है।
संपादित करें: कि फिर से पढ़ने पर, मैं बाहर बिंदु के लिए बाध्य महसूस करते हैं कि नहीं गाय जरूरी अप्रचलित के सभी उपयोग। कई बार यह अभी भी समझ में आता है। थ्रेड-सुरक्षित वृद्धि का ओवरहेड काफी सटीक है - इसलिए यह केवल एक सवाल है कि किसी ऑब्जेक्ट को कितना बड़ा होना चाहिए, या कॉपी करने के लिए कॉपी करना कितना महंगा है। वहाँ भी बार/स्थानों आप बहुत सारे एक (असंशोधित) वस्तु की प्रतियों की है, और स्मृति में बचत एक उचित तालमेल हो सकता है - स्मृति में बचत के लिए कुछ अतिरिक्त प्रोसेसर समय का औचित्य साबित। यदि आप पेजिंग को छोटे डेटा से डिस्क पर सहेज सकते हैं, तो आप जल्द से जल्द बाहर आ सकते हैं।
तरह जेरी ताबूत ने कहा कि यह प्रदर्शन किया गया है कि गाय मुहावरा निष्पादन के मुद्दे को पेश किया ... लेकिन वहाँ वास्तव में एक और मुद्दा है।
यह संभव वास्तव में गाय की एक सामान्य कार्यान्वयन लिखने के लिए (के रूप में बहुत लेख आप लिंक में प्रदर्शन) नहीं है। std::string
के गाय कार्यान्वयन में प्रतिलिपि तब भी की जाती है जब कोई ऑपरेशन आक्रमण किया जाता है जो वास्तव में स्ट्रिंग की स्थिति को संशोधित करेगा। हालांकि, एक सूचक को यह कैसे पता होना चाहिए? यह उस कक्षा के बारे में कोई जानकारी नहीं है जो इसे इंगित करता है।
उदाहरण के लिए, मान लें कि मैं इस कार्य करें:
void method(Foo& foo, flag_t flag)
{
if (flag == flag::Yes) foo.modify();
}
void invoke(COWPointer<Foo> ptr)
{
method(*ptr, flag::No);
}
Oups! मैं Foo
ऑब्जेक्ट की एक प्रति बना देता हूं भले ही इसे संशोधित नहीं किया जा रहा है!
समस्या यह है कि जब तक यह गाय वर्ग में मदद करता है, आप वास्तव में यह रैप करने के लिए है: कि वास्तव में संशोधित करता वस्तु FooImpl
राज्य कॉपी करने के लिए जिम्मेदार होगा फू की
class Foo
{
public:
private:
COWPointer<FooImpl> mImpl;
};
और फिर तरीकों। तो सुनिश्चित करें कि वर्ग मदद करता है, लेकिन यह चांदी की बुलेट नहीं है।
और यह सब मुसीबत ... एक मीट्रिक टन आवेदन में तुल्यकालन समस्याओं के कारण वास्तव में हो रहा प्रदर्शन के बारे में सुनिश्चित किया जा रहा बिना ...
यह वास्तव में नकल से बचने के लिए आसान नहीं जब भी संभव (संदर्भ/संकेत का उपयोग) है बल्कि कुछ स्थितियों में एक संभव लाभ है कि उपयोगकर्ताओं को जो पहले से ही प्रदर्शन के मुद्दों का ध्यान रखा दंडित करेंगे के लिए अपनी कक्षा में सुधार करने की तुलना में?
"पॉइंटर" और "प्रतिलिपि पर प्रतिलिपि" के बीच एक विरोधाभास: परिभाषा के अनुसार, एक सूचक को संदर्भित करने से यह नहीं बदलता है, और *p
बदलना p
नहीं बदलता है।
तो एक कॉन्स पॉइंटर को संदर्भित किया जा सकता है, और परिणामी अंतराल संशोधित किया जा सकता है।
आप वास्तव में एक सूचक तत्व के बारे में बात कर रहे हैं, सूचक नहीं।
यह क्यूटी टूलकिट में निहित है, और 'QSharedDataPointer' कहा जाता है। यह बहुत अच्छा है। –