c++ - एसटीएल में कॉपी-ऑन-लिखित समर्थन




compiler-construction stl (2)

मैं सिर्फ कॉपी-ऑन-लिखे पर एक विकिपीडिया लेख पढ़ रहा था (यदि कोई भी फाइल सिस्टम है जो इसका समर्थन करता है तो उत्सुक है), और निम्नलिखित बीतने से आश्चर्यचकित था:

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

std::string x("Hello");

std::string y = x;  // x and y use the same buffer

y += ", World!";    // now y uses a different buffer
                    // x still uses the same old buffer

मुझे नहीं पता था कि एसटीएल में प्रति समर्थित प्रत्येक कॉपी-ऑन-लिखित था। क्या यह सच है? क्या यह अन्य एसटीएल वर्गों पर लागू होता है, जैसे std::vector या std::array ? कौन सा कंपाइलर्स अनुकूलन का समर्थन करते हैं (विशेष रूप से, मैं जी ++, इंटेल सी ++ कंपाइलर और माइक्रोसॉफ्ट सी ++ कंपाइलर के बारे में सोचता हूं)?


सी + + मानक पुस्तकालय द्वारा प्रदान की गई स्ट्रिंग क्लास, उदाहरण के लिए, विशेष रूप से प्रतिलिपि ऑन-लेखन लागू करने की अनुमति देने के लिए डिज़ाइन किया गया था

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

यदि आप एक गाय-उपयोग की स्ट्रिंग चाहते हैं, तो इसे किसी अन्य लाइब्रेरी से प्राप्त करें, जैसे कि एमएफसी / एटीएल में सीएसटीआईआर


जीसीसी std :: string के लिए कॉपी-बाय-संदर्भ का उपयोग करता है। संस्करण 4.8 के अनुसार, यह मानक के उल्लंघन के बावजूद, यह अभी भी सी ++ 11 के लिए कर रहा है।

यहाँ देखें:





copy-on-write