2013-06-06 8 views
18

अपने Blog Herb Sutter में लिखते हैंपरमाणु कमी बढ़ती तुलना में अधिक महंगा है?

[...] क्योंकि स्मार्ट सूचक संदर्भ गिनती आमतौर पर एक अनुकूलित shared_ptr कार्यान्वयन में एक साधारण वेतन वृद्धि के रूप में ही करने के लिए अनुकूलित किया जा सकता है incrementing - बस एक साधारण वेतन वृद्धि जेनरेट कोड में निर्देश, और कोई बाड़ नहीं।

हालांकि, घटती एक परमाणु घटती या समकक्ष, जो विशेष प्रोसेसर स्मृति निर्देश है कि खुद को में अधिक महंगे हैं उत्पन्न करता है, और कहा कि आसपास के कोड के अनुकूलन पर कि प्रेरित स्मृति बाड़ प्रतिबंध के शीर्ष पर होना चाहिए।

पाठ shared_ptr के कार्यान्वयन के बारे में है और मुझे यकीन नहीं है कि उनकी टिप्पणी केवल इस पर लागू होती है या आम तौर पर मामला है। अपने फॉर्मूलेशन से मैं इसे आम तौर पर इकट्ठा करता हूं।

लेकिन जब मैं इसके बारे में सोचता हूं तो मैं केवल "अधिक महंगी कमी" के बारे में सोच सकता हूं जब if(counter==0) तत्काल निम्नानुसार होता है - जो शायद shared_ptr के मामले में है।

इसलिए मुझे आश्चर्य है अगर परमाणु आपरेशन ++counter (आमतौर पर) है हमेशा तेजी से से --counter, या सिर्फ इसलिए कि यह shared_ptr साथ if(--counter==0)... प्रयोग किया जाता है?

+1

* "उनके निर्माण से मैं आम तौर पर इकट्ठा होता हूं" * - मैं इसके विपरीत इकट्ठा करता हूं, हालांकि। –

+0

आप लिखने वाले बाधा को भी देखना चाहते हैं जो कि - काउंटर == 0 के लिए आवश्यक है, और जो आम तौर पर सबसे महंगा है, जैसा कि एकमात्र प्रकार का बाधा है जिसके लिए डेटा लिखने के बाद सही होना आवश्यक है कोर के बीच सिंक्रनाइज़ेशन की गारंटी को फिर से पढ़ना होगा। काउंटर ++ के लिए आप इस मूल्य की सिंक्रनाइज़ स्थिति, या अन्य डेटा प्राप्त करने के लिए तत्काल आवश्यकता के बिना लिखते हैं। –

उत्तर

11

मेरा मानना ​​है कि यह इस तथ्य का जिक्र कर रहा है कि वृद्धि "छुपा" हो सकती है, जहां "कमी और जांच" को एक ऑपरेशन के रूप में किया जाना है।

मैं किसी भी वास्तुकला जहां --counter (या counter--, asssuming हम int, चार, आदि जैसे सरल डेटाटाइप्स के बारे में बात कर रहे हैं) ++counter या counter++ धीमी गति से है के बारे में पता नहीं कर रहा हूँ।

+0

"छुपे हुए" से आपका क्या मतलब है? – curiousguy

+0

हालांकि, वह जो कह रहा है उसके विपरीत यह काफी विपरीत है। वह स्पष्ट रूप से "साधारण वृद्धि" कह रहा है। यह मूल्य या बाद में ऐसी किसी भी चीज़ की जांच न करने के बारे में नहीं है। यह एक साधारण वृद्धि का उपयोग करने के बारे में है (कैशलाइन पढ़ें, संशोधित करें, कैशलाइन लिखें) जो _will_ समरूपता की उपस्थिति में संदर्भ खो देता है। इसलिए मैं दृढ़ता से कहने के इच्छुक हूं कि वह जो कह रहा है वह गलत है। सटर भी गलत चीजें कह सकता है, क्यों नहीं। – Damon

16

वह कहीं और विस्तार से इसकी चर्चा करता है, मुझे लगता है कि उसकी atomic<> weapons प्रस्तुति में। असल में यह सब कुछ है जहां साझा_प्टर उपयोग मामले में मेमोरी बाड़ की आवश्यकता होती है, परमाणु वृद्धि के बनाम घटकों की कोई आंतरिक संपत्ति नहीं।

कारण यह है कि आप वास्तव में किसी भी गिनती स्मार्ट पॉइंटर के साथ वृद्धि के सटीक क्रम की परवाह नहीं करते हैं, जब तक कि आप किसी को याद न करें, लेकिन कमी के साथ यह महत्वपूर्ण है कि आपके पास मेमोरी बाधाएं हों ताकि आपके अंतिम कमी पर जो डिलीट को ट्रिगर करता है, आपको स्मृति की मुक्त होने के बाद स्मार्ट पॉइंटर द्वारा स्वामित्व वाली ऑब्जेक्ट पर किसी अन्य थ्रेड से पिछली मेमोरी एक्सेस की कोई संभावना नहीं होती है।

+0

हर्ब की बात सुपर-डुप्कर है! धन्यवाद! +1 – towi

+0

"जब तक आप किसी को याद नहीं करते हैं" महत्वपूर्ण हिस्सा है, हालांकि। वह, और कमी के संबंध में पहले-गारंटी गारंटी (लेकिन यह परमाणु कमी से संभाला जाता है)। वह स्पष्ट रूप से "सामान्य वृद्धि" कह रहा है, जो एक समवर्ती परिदृश्य में कुछ वृद्धि को याद करता है। हो सकता है कि वह कुछ अलग कहने के लिए _meant_, लेकिन वैसे भी उसने वही कहा। – Damon

8

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

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

संबंधित मुद्दे