c++ - Why is it dangerous to get rid of volatile? -
सी ++ में, अस्थिर
उसी तरह व्यवहार किया जाता है const
है: अस्थिर
संशोधक एक संकलन त्रुटि को ट्रिगर नहीं करना चाहता है जो किसी फ़ंक्शन को डेटा वाष्पशील करने के लिए एक पॉइंटर गुजर रहा है।
int foo (int * bar) {/ * snip * /} Int main () {volatile int * baz; foo (baz); // त्रुटि: 'अस्थिर int *' से 'int *'} के लिए अमान्य रूपांतरण
यह खतरनाक क्यों है? यह const
संशोधक के लिए स्पष्ट है जो इसे हटाने से const
सहीता को तोड़ सकता है; लेकिन क्या " अस्थिर
शुद्धता" जैसी कोई चीज है? मैं समझ नहीं सकता कि सूचक को अस्थिर करने के लिए एक पॉइंटर कैसे गुजर रहा है, क्योंकि पॉइंटर गैर-वाष्पशील डेटा से समस्या पैदा कर सकता है।
संपादित करें बस आप लोग जानते हैं कि मैं क्यों प्रयोग कर रहा था < कोड> अस्थिर पहले स्थान पर: मैक ओएस एक्स के कई ओएसएटॉमिक
फ़ंक्शन ऑफ़ फ़ॉक्ट्स (परमाणु वेतन वृद्धि, घटाता, अतिरिक्त, घटाव, तुलना और स्वैप आदि) के लिए अस्थिर
तर्क।
न केवल संकलक गैर-वाष्पशील चर तक पहुंच का अनुकूलन कर सकता है, यह भविष्यवाणी / अचंभित रूप से अपडेट कर सकता है, जब तक कि प्रोग्राम का अनुक्रमिक निष्पादन अप्रभावित होता है।
यदि आपके अस्थिर चर में लिखता है तो आपका डिज़ाइन नहीं टूटता है, शायद इसे अस्थिर होने की आवश्यकता नहीं है किसी भी संदर्भ में।
उदाहरण के लिए, यह सी ++ 03 कंपाइलर के लिए पूरी तरह से कानूनी है
int परिणाम; शून्य sum_if_all_positive (std :: सरणी & lt; N & gt; आरी) {int sum = 0; परिणाम = -1; (इंट आई = 0; आई & lt; N; ++ i) के लिए (यदि (आर्य [i] & lt; 0) वापसी; Sum + = ary [i]; } परिणाम = योग; }
में
पूर्ण परिणाम; शून्य sum_if_all_positive (std :: सरणी & lt; N & gt; आरी) {परिणाम = 0; के लिए (int i = 0; i & lt; N; ++ i) {if (आर्य [i] & lt; 0) {परिणाम = -1; वापसी; } परिणाम + = आरी [i]; }}
(यद्यपि इस तरह के बदलाव सस्ते मेमोरी एक्सेस के साथ कुछ आर्किटेक्चर और बहुत कम रजिस्टरों पर योग के पंजीकरण से बेहतर प्रदर्शन प्रदान करेगा। माइक्रोचिप पीआईसी आर्किटेक्चर दिमाग में आता है।)
Comments
Post a Comment