क्या std :: share_ptr का एक गैर-परमाणु समतुल्य है? और <मेमोरी> में एक क्यों नहीं है?


88

यह एक दो भाग का सवाल है, सभी की परमाणुता के बारे में std::shared_ptr:

1. जहाँ तक मैं बता सकता हूँ, उस परमाणु std::shared_ptrमें एकमात्र स्मार्ट पॉइंटर है <memory>। मैं सोच रहा था कि क्या कोई गैर-परमाणु संस्करण std::shared_ptrउपलब्ध है (मैं इसमें कुछ भी नहीं देख सकता <memory>, इसलिए मैं मानक के बाहर के सुझावों के लिए भी खुला हूं, जैसे कि बूस्ट में)। मुझे पता boost::shared_ptrहै कि परमाणु भी है (यदि BOOST_SP_DISABLE_THREADSपरिभाषित नहीं है), लेकिन हो सकता है कि कोई दूसरा विकल्प हो? मैं ऐसी चीज की तलाश कर रहा हूं std::shared_ptr, जिसमें वैसा ही शब्दार्थ हो , लेकिन बिना परमाणु के।

2. मैं समझता हूं कि std::shared_ptrपरमाणु क्यों है; यह बहुत अच्छा है हालांकि, यह हर स्थिति के लिए अच्छा नहीं है, और C ++ ने ऐतिहासिक रूप से "केवल आपके उपयोग के लिए भुगतान करें" का मंत्र दिया है। यदि मैं कई थ्रेड्स का उपयोग नहीं कर रहा हूं, या यदि मैं कई थ्रेड्स का उपयोग कर रहा हूं, लेकिन थ्रेड्स में सूचक स्वामित्व साझा नहीं कर रहा हूं, तो एक परमाणु स्मार्ट पॉइंटर ओवरकिल है। मेरा दूसरा सवाल यह है कि std::shared_ptrC ++ 11 में प्रदान किया गया गैर-परमाणु संस्करण क्यों नहीं था ? (यह मानते हुए कि एक क्यों है ) (यदि उत्तर "बस एक गैर-परमाणु संस्करण है तो कभी नहीं माना गया" या "किसी ने कभी भी गैर-परमाणु संस्करण के लिए नहीं पूछा" यह ठीक है!)।

प्रश्न # 2 के साथ, मैं सोच रहा हूं कि क्या किसी ने कभी shared_ptr(या तो बूस्ट या मानक समिति के लिए) का गैर-परमाणु संस्करण प्रस्तावित किया ( परमाणु संस्करण को प्रतिस्थापित करने के लिए नहीं shared_ptr, लेकिन इसके साथ सह-अस्तित्व के लिए) और इसे एक के लिए गोली मार दी गई थी विशिष्ट कारण


4
क्या "लागत" आप यहाँ के बारे में चिंतित हैं? पूर्णांक में परमाणु वृद्धि पर लागत? क्या यह वास्तव में एक लागत है जो आपको किसी भी वास्तविक एप्लिकेशन के लिए चिंतित करती है? या आप सिर्फ समय से पहले अनुकूलन कर रहे हैं?
निकोल बोल

9
@ निकोलबोलस: यह किसी भी चीज़ की तुलना में अधिक उत्सुकता है; मेरे पास (वर्तमान में) कोई कोड / परियोजना नहीं है जहां मैं गंभीरता से एक गैर-परमाणु साझा सूचक का उपयोग करना चाहता हूं। हालांकि, मेरे पास परियोजनाएं हैं (अतीत में) जहां बूस्ट की shared_ptrपरमाणु क्षमता के कारण एक महत्वपूर्ण मंदी थी, और परिभाषित करने BOOST_DISABLE_THREADSसे ध्यान देने योग्य अंतर हुआ (मुझे नहीं पता कि std::shared_ptrक्या वही लागत होती जो कि boost::shared_ptrथी)।
कॉर्नस्टालक्स

13
@ मतदाता: प्रश्न का कौन सा भाग रचनात्मक नहीं है? यदि दूसरे प्रश्न के लिए कोई विशिष्ट क्यों नहीं है , तो यह ठीक है (एक सरल "यह बस नहीं माना जाता था" एक मान्य पर्याप्त उत्तर होगा)। यदि कोई विशिष्ट कारण / तर्क मौजूद है, तो मैं उत्सुक हूं । और पहला सवाल निश्चित रूप से एक वैध सवाल है, मैं कहूंगा। यदि मुझे प्रश्न को स्पष्ट करने की आवश्यकता है, या इसके लिए थोड़ा समायोजन करना है, तो कृपया मुझे बताएं। लेकिन मैं यह नहीं देखता कि यह रचनात्मक कैसे नहीं है।
कॉर्न्स्टल

10
@Cornstalks खैर, यह शायद सिर्फ इतना है कि लोग उन सवालों पर प्रतिक्रिया नहीं देते हैं, जिन्हें वे आसानी से "समय से पहले अनुकूलन" के रूप में खारिज कर सकते हैं , कोई फर्क नहीं पड़ता कि प्रश्न कितना वैध, अच्छा या प्रासंगिक है। मैं खुद के लिए इसे गैर-रचनात्मक के रूप में बंद करने का कोई कारण नहीं देखता हूं।
क्रिश्चियन राऊ

13
(अब यह बंद है, इसलिए टिप्पणी करते हुए एक उत्तर नहीं लिख सकता है) जीसीसी के साथ जब आपका कार्यक्रम कई थ्रेड का shared_ptrउपयोग नहीं करता है तो रिफॉक्मेंट के लिए परमाणु ऑप्स का उपयोग नहीं करता है। GCC को पैच के लिए gcc.gnu.org/ml/libstdc++/2007-10/msg00180.html पर देखें (2) गैर-परमाणु कार्यान्वयन को मल्टीथ्रेडेड एप्लिकेशन में भी उपयोग करने की अनुमति देने के लिए, उन shared_ptrवस्तुओं के लिए जिन्हें बीच साझा नहीं किया गया है। धागे। मैं वर्षों से उस पैच पर बैठा हूं लेकिन मैं आखिरकार जीसीसी के लिए इसे लागू करने पर विचार कर रहा हूं। 4.9
जोनाथन वैक्ली

जवाबों:


104

1. मैं सोच रहा था कि क्या std का एक गैर-परमाणु संस्करण है :: share_ptr उपलब्ध

मानक द्वारा प्रदान नहीं किया गया। अच्छी तरह से एक "3 डी पार्टी" पुस्तकालय द्वारा प्रदान किया जा सकता है। दरअसल, C ++ 11 से पहले, और बूस्ट से पहले, ऐसा लग रहा था कि सभी ने अपना स्वयं का संदर्भ लिखा था स्मार्ट पॉइंटर (खुद सहित)।

2. मेरा दूसरा सवाल यह है कि st + का गैर-परमाणु संस्करण क्यों नहीं था :: साझा_प्ट्र सी ++ 11 में प्रदान किया गया?

इस सवाल पर 2010 में रैपरस्विल बैठक में चर्चा की गई थी। इस विषय को स्विट्जरलैंड द्वारा एक राष्ट्रीय निकाय टिप्पणी # 20 द्वारा पेश किया गया था। बहस के दोनों पक्षों में मजबूत तर्क थे, जिनमें आप अपने प्रश्न प्रदान करते हैं। हालाँकि, चर्चा के अंत में, एक असंबद्ध (गैर-परमाणु) संस्करण को जोड़ने के खिलाफ वोट भारी (लेकिन एकमत नहीं था) shared_ptr

शामिल के खिलाफ तर्क:

  • कोड को बिना किसी चेतावनी के साथ डिबग समस्याओं के कारण समाप्त करने के लिए सड़क के नीचे थ्रेडेड कोड में उपयोग किया जा रहा है, जिसके बिना unsynchronized shared_ptr के साथ लिखा कोड समाप्त हो सकता है।

  • संदर्भ गणना में ट्रैफ़िक के लिए "एक ही रास्ता" एक "सार्वभौमिक" साझा करने से लाभ होता है: मूल प्रस्ताव से :

    उपयोग की गई सुविधाओं की परवाह किए बिना एक ही वस्तु प्रकार है, तीसरे पक्ष के पुस्तकालयों सहित पुस्तकालयों के बीच अंतर की सुविधा को बहुत सुविधाजनक बनाता है।

  • परमाणु की लागत, जबकि शून्य नहीं है, भारी नहीं है। चाल निर्माण और चाल असाइनमेंट के उपयोग से लागत को कम किया जाता है जिसे परमाणु संचालन का उपयोग करने की आवश्यकता नहीं होती है। इस तरह के ऑपरेशन आमतौर पर vector<shared_ptr<T>>मिटा और डालने में उपयोग किए जाते हैं ।

  • कुछ भी नहीं लोगों को अपने स्वयं के गैर-परमाणु संदर्भ-गिने हुए स्मार्ट पॉइंटर को लिखने से रोकते हैं यदि वास्तव में वे क्या करना चाहते हैं।

उस दिन रैपरविल में LWG का अंतिम शब्द था:

CH 20 अस्वीकार करें। इस समय परिवर्तन करने के लिए कोई आम सहमति नहीं है।


7
वाह, सही, जानकारी के लिए धन्यवाद! ठीक इसी तरह की जानकारी मुझे मिलने की उम्मीद थी।
कॉर्नस्टॉक

> Has the same object type regardless of features used, greatly facilitating interoperability between libraries, including third-party libraries. यह एक बहुत ही अजीब तर्क है। थर्ड पार्टी लाइब्रेरी अपने स्वयं के प्रकार वैसे भी उपलब्ध कराएंगे, इसलिए यदि वे इसे std :: साझा_ptr <CustomType>, std :: non_atomic_sared_ptr <CustomType>, आदि के रूप में प्रदान करते हैं तो यह क्यों महत्वपूर्ण होगा? आपको हमेशा अपने कोड को इस बात के अनुकूल बनाना होगा कि लाइब्रेरी कैसी भी हो
जीन-माइकेल सेलेरियर

यह सच है जहां तक ​​पुस्तकालय-विशिष्ट प्रकार चलते हैं, लेकिन विचार यह है कि ऐसे बहुत सारे स्थान हैं जहां मानक प्रकार तृतीय-पक्ष एपीआई में दिखाई देते हैं। उदाहरण के लिए, मेरा पुस्तकालय std::shared_ptr<std::string>कहीं ले जा सकता है। अगर किसी और की लाइब्रेरी उस प्रकार को भी लेती है, तो कॉल करने वालों को असुविधा या ओवरहेड के बिना अलग-अलग अभ्यावेदन के बीच हम दोनों को एक ही तार पास कर सकते हैं, और यह सभी के लिए एक छोटी जीत है।
जैक ओ'कॉनर

52

हॉवर्ड ने इस सवाल का पहले ही जवाब दे दिया, और निकोल ने बहुत से असंगत लोगों के बजाय एकल मानक साझा सूचक प्रकार होने के लाभों के बारे में कुछ अच्छे बिंदु बनाए।

जब मैं समिति के फैसले से पूरी तरह सहमत हूं, तो मुझे लगता है कि विशेष मामलों में एक असंबद्ध shared_ptr-समान प्रकार का उपयोग करने के लिए कुछ लाभ हैं , इसलिए मैंने कुछ बार विषय की जांच की है।

यदि मैं कई थ्रेड्स का उपयोग नहीं कर रहा हूं, या यदि मैं कई थ्रेड्स का उपयोग कर रहा हूं, लेकिन थ्रेड्स के पार सूचक स्वामित्व साझा नहीं कर रहा हूं, तो एक परमाणु स्मार्ट पॉइंटर ओवरकिल है।

GCC के साथ जब आपका प्रोग्राम कई थ्रेड्स का उपयोग नहीं करता है साझा किया जाता है, तो refcount के लिए परमाणु ऑप्स का उपयोग नहीं करता है। यह रैपर फ़ंक्शंस के माध्यम से संदर्भ गणना को अपडेट करके किया जाता है जो यह पता लगाता है कि क्या प्रोग्राम मल्टीथ्रेडेड है (जीएनयू / लिनक्स पर यह केवल यह पता लगाने के द्वारा किया जाता है कि क्या प्रोग्राम लिंक करता है libpthread.so) और तदनुसार परमाणु या गैर-परमाणु संचालन को प्रेषण करें।

मुझे कई साल पहले एहसास हुआ था कि क्योंकि जीसीसी shared_ptr<T>एक __shared_ptr<T, _LockPolicy>बेस क्लास के संदर्भ में लागू किया गया है, इसलिए आधार क्लास का उपयोग मल्टीट्र्रेडेड कोड में सिंगल थ्रेडेड लॉकिंग पॉलिसी के साथ भी स्पष्ट रूप से करके संभव है __shared_ptr<T, __gnu_cxx::_S_single>। दुर्भाग्य से क्योंकि यह एक इच्छित उपयोग का मामला नहीं था, यह जीसीसी 4.9 से पहले काफी काम किया था, और कुछ ऑपरेशन अभी भी आवरण कार्यों का उपयोग करते हैं और इसलिए परमाणु कार्यों के लिए भेजा गया है, भले ही आपने स्पष्ट रूप से _S_singleनीति का अनुरोध किया हो । बिंदु देखें (2) http://gcc.gnu.org/ml/libstdc++/2007-10/msg001/.html परअधिक जानकारी और जीसीसी को एक पैच के लिए गैर-परमाणु कार्यान्वयन को मल्टीथ्रेड एप्लिकेशन में भी उपयोग करने की अनुमति देता है। मैं वर्षों तक उस पैच पर बैठा रहा, लेकिन आखिरकार मैंने इसे जीसीसी 4.9 के लिए प्रतिबद्ध कर दिया, जो आपको एक साझा टेम्पलेट प्रकार को परिभाषित करने के लिए इस तरह से एक अन्य टेम्पलेट का उपयोग करने की अनुमति देता है जो थ्रेड-सुरक्षित नहीं है, लेकिन थोड़ा तेज है:

template<typename T>
  using shared_ptr_unsynchronized = std::__shared_ptr<T, __gnu_cxx::_S_single>;

इस प्रकार के साथ इंटरऑपरेबल नहीं होगा std::shared_ptr<T>और केवल यह उपयोग करने के लिए सुरक्षित होगा जब यह गारंटी दी जाती है कि shared_ptr_unsynchronizedऑब्जेक्ट को अतिरिक्त उपयोगकर्ता द्वारा प्रदान किए गए सिंक्रनाइज़ेशन के बिना थ्रेड्स के बीच साझा नहीं किया जाएगा।

यह बेशक पूरी तरह से गैर-पोर्टेबल है, लेकिन कभी-कभी यह ठीक है। सही पूर्वप्रक्रमक हैक्स के साथ आपका कोड अभी भी अन्य कार्यान्वयनों के साथ ठीक काम करेगा यदि इसके shared_ptr_unsynchronized<T>लिए एक उपनाम है shared_ptr<T>, तो यह जीसीसी के साथ थोड़ा तेज होगा।


यदि आप 4.9 से पहले जीसीसी का उपयोग कर रहे हैं, तो आप इसका उपयोग _Sp_counted_base<_S_single>अपने कोड में स्पष्ट विशेषज्ञता जोड़कर कर सकते हैं (और __shared_ptr<T, _S_single>ओडीआर उल्लंघनों से बचने के लिए विशिष्टताओं को शामिल किए बिना कभी भी तत्काल सुनिश्चित कर सकते हैं ।) इस stdप्रकार के विशिष्टताओं को जोड़ना तकनीकी रूप से अपरिभाषित है, लेकिन होगा। व्यवहार में काम करें, क्योंकि इस मामले में मेरे लिए जीसीसी में विशेषज्ञता जोड़ने या आप उन्हें अपने कोड में जोड़ने के बीच कोई अंतर नहीं है।


2
बस सोच रहा था, क्या आपके उदाहरण में टेम्पलेट का उपनाम है? Ie मुझे लगता है कि इसे share_ptr_unsynchronized = std :: __ shared_ptr <पढ़ना चाहिए। संयोग से, मैंने इसे आज परीक्षण किया, std के साथ संयोजन में :: __ enable_sared_from_this और std :: __ weak_ptr, और यह अच्छी तरह से काम करने लगता है (gcc 4.9 और gcc 5.2)। मैं शीघ्र ही इसे देख / अनसुना कर दूंगा कि क्या वास्तव में परमाणु संचालनों को छोड़ दिया गया है।
कार्ल कुक

बहुत बढ़िया विवरण! हाल ही में मैं एक मुद्दा है, में वर्णित के रूप का सामना करना पड़ा इस सवाल का , है कि अंततः मुझे के स्रोत कोड में देखने के लिए किए गए std::shared_ptr, std::__shared_ptr, __default_lock_policyऔर इस तरह के। इस उत्तर ने पुष्टि की कि मैंने कोड से क्या समझा।
नवाज

21

मेरा दूसरा सवाल यह है कि st + का गैर-परमाणु संस्करण क्यों नहीं था :: साझा_प्रति C ++ 11 में प्रदान किया गया? (यह मानते हुए कि ऐसा क्यों है)।

कोई भी आसानी से पूछ सकता है कि कोई घुसपैठिया सूचक क्यों नहीं है, या साझा किए गए बिंदुओं के किसी भी संभावित विविधता के किसी भी संख्या में कोई भी हो सकता है।

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

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

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

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

std::vectorकुछ कोने के मामलों में नग्न सरणियों की तुलना में कुछ अक्षमताएं भी हैं। इसकी कुछ सीमाएँ हैं; कुछ उपयोग वास्तव में vectorएक फेंक आवंटनकर्ता का उपयोग किए बिना, के आकार पर एक कठिन सीमा चाहते हैं । हालाँकि, समिति ने vectorसभी के लिए सब कुछ होने के लिए डिज़ाइन नहीं किया । यह अधिकांश अनुप्रयोगों के लिए एक अच्छा डिफ़ॉल्ट होने के लिए डिज़ाइन किया गया था। जिनके लिए यह काम नहीं कर सकता है वे सिर्फ एक विकल्प लिख सकते हैं जो उनकी जरूरतों को पूरा करता है।

बस के रूप में आप एक स्मार्ट सूचक के लिए कर सकते हैं अगर shared_ptrपरमाणु एक बोझ है। तो फिर, कोई भी उन्हें इतने के आसपास नकल नहीं करने पर विचार कर सकता है।


7
+1 के लिए "कोई भी उन्हें इतने के आसपास नकल नहीं करने पर विचार कर सकता है।"
अली

यदि आप कभी भी किसी प्रॉपर को हुक करते हैं, तो आप विशेष हैं और आप ऊपर दिए गए तर्कों को समझ सकते हैं। यदि आपके पास कोई ऐसी ऑपरेशनल आवश्यकता नहीं है जो मिलना मुश्किल है तो आपको C ++ का उपयोग नहीं करना चाहिए। आपके जैसा तर्क करना, C ++ को उच्च प्रदर्शन या कम विलंबता में रुचि रखने वाले किसी भी व्यक्ति द्वारा सार्वभौमिक रूप से संशोधित करने का एक अच्छा तरीका है। यही कारण है कि गेम प्रोग्रामर एसटीएल, बूस्ट या यहां तक ​​कि अपवादों का उपयोग नहीं करते हैं।
हंस मल्हर्बे

स्पष्टता के लिए, मुझे लगता है कि आपके उत्तर के शीर्ष पर स्थित उद्धरण को पढ़ना चाहिए "क्यों std का एक गैर-परमाणु संस्करण नहीं था :: साझा_ptr C ++ 11 में प्रदान किया गया?"
चार्ल्स सावोई

4

मैं काम के दौरान share_ptr पर एक बात तैयार कर रहा हूं। मैं अलग-अलग मॉलोक से बचने के लिए एक संशोधित बूस्ट share_ptr का उपयोग कर रहा हूं (जैसे मेक_ड्रेसड क्या कर सकता है) और ऊपर बताए गए शेयर्ड_प्ट्र_सुनसिंक्रनाइज्ड जैसे लॉक पॉलिसी के लिए एक टेम्पलेट परम। से प्रोग्राम का उपयोग कर रहा हूं

http://flyingfrogblog.blogspot.hk/2011/01/boosts-sharedptr-up-to-10-slower-than.html

परीक्षण के रूप में, अनावश्यक शेयर्ड_प्ट्र प्रतियों को साफ करने के बाद। कार्यक्रम केवल मुख्य थ्रेड का उपयोग करता है और परीक्षण तर्क दिखाया जाता है। परीक्षा env एक linuxmint चलाने वाली नोटबुक है। यहाँ सेकंड में लिया गया समय है:

टेस्ट रन सेटअप बूस्ट (1.49) एसटीडी मेक_सेरड मॉडिफाइड बूस्ट के साथ
mt-unsafe (11) 11.9 9 / 11.5 (-pthread on) 8.4  
परमाणु (11) 13.6 12.4 13.0  
mt-unsafe (12) 113.5 85.8 / 108.9 (-थ्रेड पर) 81.5  
परमाणु (12) 126.0 109.1 123.6  

केवल 'एसटीडी' संस्करण का उपयोग करता है -std = cxx11, और -pthread संभावना स्विच करता है g_ __sared_ptr वर्ग में lock_policy।

इन नंबरों से, मुझे कोड अनुकूलन पर परमाणु निर्देशों का प्रभाव दिखाई देता है। परीक्षण के मामले में किसी भी C ++ कंटेनर का उपयोग नहीं किया जाता है, लेकिन vector<shared_ptr<some_small_POD>>यदि ऑब्जेक्ट को थ्रेड सुरक्षा की आवश्यकता नहीं है, तो पीड़ित होने की संभावना है। बूस्ट शायद कम ग्रस्त है क्योंकि अतिरिक्त मॉलोक इनलाइनिंग और कोड ऑप्टिमिज़ेटोन की मात्रा को सीमित कर रहा है।

मुझे अभी तक परमाणु निर्देशों की मापनीयता का परीक्षण करने के लिए पर्याप्त कोर के साथ एक मशीन का पता लगाना है, लेकिन केवल आवश्यक होने पर ही std :: shared_ptr का उपयोग करना बेहतर है।


3

बूस्ट एक shared_ptrगैर-परमाणु प्रदान करता है । यह कहा जाता है local_shared_ptr, और स्मार्ट पॉइंटर्स लाइब्रेरी ऑफ बूस्ट में पाया जा सकता है।


अच्छा उद्धरण के साथ एक संक्षिप्त ठोस उत्तर के लिए +1, लेकिन यह सूचक प्रकार स्मृति और रनटाइम दोनों के संदर्भ में महंगा लगता है, अप्रत्यक्ष के एक अतिरिक्त स्तर (स्थानीय-> साझा-> ptr बनाम साझा-> ptr) के कारण।
रेड.वे।

@ Red.Wave आप बता सकते हैं कि अप्रत्यक्ष के साथ आपका क्या मतलब है और यह प्रदर्शन को कैसे प्रभावित करता है? क्या आपका मतलब है कि यह shared_ptrवैसे भी एक काउंटर के साथ है, भले ही यह स्थानीय हो? या आप इसका मतलब यह है कि इसके साथ एक और समस्या है? डॉक्स का कहना है कि अंतर केवल इतना है कि यह परमाणु नहीं है।
क्वांटम भौतिक विज्ञानी

प्रत्येक स्थानीय ptr मूल साझा ptr के लिए एक गणना और खंडन रखता है। इस प्रकार अंतिम पॉइन्ट्री तक किसी भी पहुंच के लिए स्थानीय से साझा पीटीआर के लिए एक डेरेफ्रेंस की आवश्यकता होती है, जो कि पॉइन्टी के लिए डीरेफ्रेंस है। इस प्रकार साझा पीटीआर से अप्रत्यक्ष तक एक और अप्रत्यक्ष रूप से ढेर हो गया है। और वह ओवरहेड बढ़ जाता है।
रेड.वे।

@ Red.Wave आपको यह जानकारी कहां से मिल रही है? यह: "इस प्रकार अंतिम पॉइन्ट्री तक किसी भी पहुंच को स्थानीय से साझा पीटीआर के लिए एक आवश्यकता है" कुछ उद्धरण की आवश्यकता है। मुझे लगता है कि बढ़ावा डॉक्स में नहीं मिला। फिर से, मैंने डॉक्स में जो देखा वह यह है कि यह परमाणु के अलावा local_shared_ptrऔर shared_ptrसमान हैं। मैं वास्तव में यह जानने में दिलचस्पी रखता हूं कि आप जो कह रहे हैं वह सच है क्योंकि मैं उन local_shared_ptrअनुप्रयोगों में उपयोग करता हूं जिनके लिए उच्च प्रदर्शन की आवश्यकता होती है।
क्वांटम भौतिक विज्ञानी

3
@ Red.Wave यदि आप वास्तविक स्रोत कोड github.com/boostorg/smart_ptr/blob/ पर नजर डालें तो आप देखेंगे कि कोई दोहरा अप्रत्यक्ष नहीं है। प्रलेखन में यह पैराग्राफ सिर्फ एक मानसिक मॉडल है।
इल्या पोपोव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.