एसटीएल मानक को std :: स्ट्रिंग से refcounted करने की आवश्यकता नहीं है। लेकिन वास्तव में सी ++ कार्यान्वयन के अधिकांश पुनर्नवीनीकरण, कॉपी-ऑन-राइट स्ट्रिंग प्रदान करते हैं, जिससे आप स्ट्रिंग को मूल प्रकार के रूप में मानते हैं। इन कार्यान्वयन (कम से कम जी ++) परमाणु संचालन का उपयोग करते हैं जो इन स्ट्रिंग लॉक-फ्री और थ्रेड सुरक्षित बनाते हैं।वीसी ++ स्ट्रिंग्स का संदर्भ क्यों नहीं दिया जाता है?
आसान परीक्षण कॉपी-ऑन-राइट सीमेंटिक्स पता चलता है:
#include <iostream>
#include <string>
using namespace std;
void foo(string s)
{
cout<<(void*)s.c_str()<<endl;
string ss=s;
cout<<(void*)ss.c_str()<<endl;
char p=ss[0];
cout<<(void*)ss.c_str()<<endl;
}
int main()
{
string s="coocko";
cout<<(void*)s.c_str()<<endl;
foo(s);
cout<<(void*)s.c_str()<<endl;
}
केवल दो adresses मुद्रित कर रहे हैं वास्तव में के बाद एक गैर निरंतर सदस्य इस्तेमाल किया गया था।
मैंने एचपी, जीसीसी और इंटेल कंपाइलर का उपयोग करके इस कोड का परीक्षण किया और इसी तरह के परिणाम प्राप्त किए - स्ट्रिंग्स कॉपी-ऑन-राइट कंटेनर के रूप में काम करते हैं।
दूसरी ओर, वीसी ++ 2005 स्पष्ट रूप से दिखाता है कि प्रत्येक स्ट्रिंग पूरी तरह से कॉपी की जाती है।
क्यों?
मुझे पता है कि वीसी ++ 6.0 में एक बग था जिसमें संदर्भ गिनती के गैर-थ्रेड-सुरक्षित कार्यान्वयन था जो यादृच्छिक कार्यक्रम के कारण बनता था। क्या यही कारण है? वे सिर्फ रेफ-गिनती का उपयोग करने से डरते हैं, फिर भी यह सामान्य अभ्यास है? वे इस मुद्दे को ठीक करने के लिए रीफ-गिनती का उपयोग नहीं करना पसंद करते हैं?
धन्यवाद
मुझे विश्वास है कि स्कॉट Meyers अपनी पुस्तकों में से एक में कुछ इसी तरह का उल्लेख है - अदालत में तलब नहीं कर सकते (और यहां तक यकीन नहीं), क्योंकि मैं पर मेरे साथ उन्हें जरूरत नहीं है पल। –
+1, उस संदर्भ को देखने में 10 मिनट बिताए। एसओ पर इतने सारे सी ++ प्रश्न हैं जिन्हें हर्ब के लेखन के लिए केवल एक सूचक की आवश्यकता होती है। – JaredPar
वास्तव में यह आलेख स्पष्ट रूप से दिखाता है कि परमाणु संचालन का उपयोग कर गाय स्ट्रिंग सामान्य गाय स्ट्रिंग के समान प्रदर्शन करते हैं। (25% का अंतर) तो यह बहुत अधिक "ओवरहेड" नहीं है, और वास्तविक प्रतिलिपि करने के लिए बदनाम रूप से बहुत कुछ है। – Artyom