मैं सिर्फ 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
नहीं बदलता है।
तो एक कॉन्स पॉइंटर को संदर्भित किया जा सकता है, और परिणामी अंतराल संशोधित किया जा सकता है।
आप वास्तव में एक सूचक तत्व के बारे में बात कर रहे हैं, सूचक नहीं।
- 1. कोई बढ़ावा नहीं है :: फाइल सिस्टम :: move_file?
- 2. बढ़ावा है :: इंटरप्रोसेस थ्रेडसेफ?
- 3. आईपीसी को बढ़ावा देने वाला कोई अच्छा है?
- 4. क्या सी ++ 11 मानक कुछ बढ़ावा देता है :: कोई भी?
- 5. बढ़ावा:
- 6. क्या कोई बढ़ावा :: वैकल्पिक स्थानांतरित करना संभव है?
- 7. क्या LIMIT 1 में कोई प्रदर्शन बढ़ावा है?
- 8. बढ़ावा :: टोकननाइज़र बनाम बढ़ावा :: विभाजन
- 9. "कोई नहीं है" और "== कोई नहीं"
- 10. बढ़ावा :: make_shared कॉलिंग (प्लेसमेंट) ऑपरेटर नया नहीं है?
- 11. क्यों बढ़ावा करता :: संस्करण प्रदान नहीं ऑपरेटर! =
- 12. पदों को बढ़ावा नहीं दे सकता
- 13. बढ़ावा है :: make_shared अप्रचलित अब?
- 14. बढ़ावा भावना
- 15. iBatis कोई पॉप नहीं है जब कोई पंक्ति नहीं है
- 16. क्या कोई बढ़ावा :: सिग्नल 2 सिग्नल के आमंत्रण क्रमबद्ध करने का कोई मौजूदा तरीका है?
- 17. कोई वस्तु नहीं है?
- 18. कोई फंक्शन नहीं है?
- 19. बढ़ावा pool_alloc
- 20. बढ़ावा :: lexical_cast
- 21. बढ़ावा तारीख
- 22. बढ़ावा :: program_options: बिना कोई आदेश निर्दिष्ट कैसे करें "-" या "-"
- 23. जेवीएम स्टार्टअप स्पीड को बढ़ावा देने का कोई तरीका?
- 24. बढ़ावा स्रोत कोड
- 25. कोई WebAplicationContext नहीं मिला: कोई ContextLoaderListener पंजीकृत नहीं है?
- 26. बढ़ावा है :: posix_time :: microsec_clock CPU गहन?
- 27. बढ़ावा :: गुमनाम खंड
- 28. सरल बढ़ावा सबमिशन; सलाह?
- 29. सी ++ 03 में कोई_एक कार्य करने के लिए सदस्य फ़ंक्शन पास करना (कोई बढ़ावा नहीं, कोई सी ++ 11)
- 30. सी ++ - बढ़ावा मिलता प्रश्न
यह क्यूटी टूलकिट में निहित है, और 'QSharedDataPointer' कहा जाता है। यह बहुत अच्छा है। –