2011-02-02 6 views
7

वर्तमान मसौदे से निम्नलिखित अंश से पता चलता है कि मैं क्या मतलब है:सी ++ 0x | क्यों std :: परमाणु अस्थिर-योग्यता के साथ प्रत्येक विधि overloads?

namespace std { 
    typedef struct atomic_bool { 
     bool is_lock_free() const volatile; 
     bool is_lock_free() const; 
     void store(bool, memory_order = memory_order_seq_cst) volatile; 
     void store(bool, memory_order = memory_order_seq_cst); 
     bool load(memory_order = memory_order_seq_cst) const volatile; 
     bool load(memory_order = memory_order_seq_cst) const; 
     operator bool() const volatile; 
     operator bool() const; 
     bool exchange(bool, memory_order = memory_order_seq_cst) volatile; 
     bool exchange(bool, memory_order = memory_order_seq_cst); 
     bool compare_exchange_weak(bool&, bool, memory_order, memory_order) volatile; 
     bool compare_exchange_weak(bool&, bool, memory_order, memory_order); 
     bool compare_exchange_strong(bool&, bool, memory_order, memory_order) volatile; 
     bool compare_exchange_strong(bool&, bool, memory_order, memory_order); 
     bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst) volatile; 
     bool compare_exchange_weak(bool&, bool, memory_order = memory_order_seq_cst); 
     bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst) volatile; 
     bool compare_exchange_strong(bool&, bool, memory_order = memory_order_seq_cst); 
     atomic_bool() = default; 
     constexpr atomic_bool(bool); 
     atomic_bool(const atomic_bool&) = delete; 
     atomic_bool& operator=(const atomic_bool&) = delete; 
     atomic_bool& operator=(const atomic_bool&) volatile = delete; 
     bool operator=(bool) volatile; 
    } atomic_bool; 
} 

वाष्पशील सकर्मक है। इस प्रकार, आप अस्थिर वस्तु से गैर-अस्थिर सदस्य फ़ंक्शन को कॉल नहीं कर सकते हैं। दूसरी ओर, एक अस्थिर सदस्य कार्य को एक अस्थिर वस्तु से कॉल करने की अनुमति है।

तो, वहाँ परमाणु कक्षाओं में अस्थिर और गैर वाष्पशील सदस्य कार्यों के बीच किसी भी कार्यान्वयन का अंतर है? दूसरे शब्दों में, क्या गैर-अस्थिर अधिभार की आवश्यकता है?

+0

एक बेहतर सवाल क्यों की जरूरत है 'होने के लिए पहली जगह में volatile' भार के है। – GManNickG

+1

@GMan: क्योंकि अन्यथा अस्थिर डेटा पर फ़ंक्शंस को नहीं बुलाया जा सकता था। ;) – jalf

+3

@jalf: Ha, हाँ, लेकिन ऑपरेशन के बाद से ही प्रकार स्वयं परमाणु (और इसलिए देखने योग्य) बनाता है, हम 'अस्थिर परमाणु <> 'क्यों बनायेंगे? मुझे लगता है कि मुझे कुछ बड़ा याद आ रहा है। – GManNickG

उत्तर

4

मुझे लगता है कि अस्थिर भार के दक्षता कारणों के लिए मौजूद हैं। अस्थिर पढ़ता है और लिखता है गैर-अस्थिर पढ़ने की तुलना में स्वाभाविक रूप से अधिक महंगा है और सी ++ 0x में लिखता है, क्योंकि स्मृति मॉडल कुछ कठोर आवश्यकताओं को रखता है जो अस्थिर चर के मूल्यों को कैशिंग रोकते हैं। यदि सभी कार्यों को केवल अस्थिर चिह्नित किया गया था, तो कोड आवश्यक रूप से कुछ अनुकूलन नहीं कर सका जो अन्यथा प्रदर्शन में सुधार करेगा। भेदभाव करने के बाद संकलक गैर-अस्थिर पढ़ने को अनुकूलित करने की अनुमति देता है और जब संभव हो तो अस्थिर पढ़ने और लिखने की आवश्यकता होने पर शानदार रूप से अपमानित होने पर लिखते हैं।

+1

अस्थिर क्वालीफायर बस संकलक अनुकूलन को रोकता है। इसके अलावा, जहां तक ​​मुझे पता है, सदस्य कार्यों पर लागू अस्थिर क्वालीफायर केवल इस विधि को अस्थिर वस्तुओं से कॉल करने की अनुमति देता है और परिणामी कोड को प्रभावित नहीं करता है। – 0xbadf00d

+4

@ FrEEzE2046- सी ++ 0x में 'अस्थिर' की परिभाषा बहुत अधिक कठोर रूप से निर्दिष्ट है और वास्तव में इसका अर्थ केवल "अनुकूलन न करें" से अधिक है। साथ ही, सदस्य फ़ंक्शन पर अस्थिर संशोधक का अधिक सटीक अर्थ यह है कि 'यह' सूचक 'अस्थिर' है, और इसलिए फ़ंक्शन में होने वाले सदस्य चर के लिए कोई भी पहुंच निश्चित रूप से अस्थिर हो जाएगी – templatetypedef

+0

ठीक है, इसका मतलब है कि किसी भी पहुंच ऑब्जेक्ट, अस्थिर सदस्य फ़ंक्शन को कॉल करते समय, अनुकूलित नहीं किया जाएगा? (अस्थिर विवरण यह है: "अस्थिर वस्तुओं तक पहुंच का मूल्यांकन अमूर्त मशीन के नियमों के अनुसार सख्ती से किया जाता है।") – 0xbadf00d

-1

सबसे पहले, यह एक अस्थिर std :: परमाणु बनाने के लिए बेमानी लगता है। दरअसल, मैं एक उपयोगी स्थिति की कल्पना कर सकता हूं। मान लें कि हमारे पास एक निश्चित डिवाइस (मेमोरी-) पता है जिसे हम चालू करना चाहते हैं। तथ्य यह है कि std :: atomic_xxx वर्गों के साथ-साथ std :: परमाणु <> टेम्पलेट कक्षा के रूप में एक ही आकार होना चाहिए के कारण उनकी संगत में निर्मित-प्रकार में, आप को संभालने के लिए दोनों चाहते हो सकता है: पर नियंत्रण के साथ परमाणु आपरेशन प्रदर्शन मेमोरी ऑर्डरिंग और सुनिश्चित करें कि हमारे परमाणु-वस्तु तक पहुंच कभी अनुकूलित नहीं होती है। इस प्रकार, हम की तरह कुछ की घोषणा कर सकता है:

std::atomic<long> volatile* vmem_first4 = reinterpret_cast<std::atomic<long> volatile*>(0xxB8000); 
+0

मानक स्पष्ट रूप से कहता है कि 'परमाणु ' के बराबर समान आकार नहीं हो सकता है 'टी' – jalf

+1

"परमाणु पते प्रकार के प्रतिनिधित्व के समान आकार के समान आकार के समान आकार की आवश्यकता नहीं है। यह वही आकार होना चाहिए जब भी मुमकिन।" तो, अस्थिर परमाणु मेरे लिए बेकार प्रतीत होता है। – 0xbadf00d

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