2009-11-03 17 views

उत्तर

7

एक चर की अस्थिरता उस स्थान को नहीं बदलेगी जिसमें एक चर संग्रहीत किया जाता है। यह क्या बदलता है इसके बारे में अर्थशास्त्र है कि इसे पढ़ने और लिखने के संबंध में कैसे पहुंचाया जाता है।

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

+0

नहीं, यह उन अर्थशास्त्र को नहीं देखता है [यह] (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2016.html) और [सीईआरटी] (https : //www.securecoding.cert.org/confluence/display/seccode/POS03-C.+Do+not+use+volatile+as+a+synchronization+primitive) कह रहा है 'सिंक्रनाइज़ेशन के लिए' अस्थिर 'का उपयोग न करें' – Spudd86

2

स्मृति के किसी भी "विशेष" खंड में अस्थिर चर के लिए कोई कारण नहीं है। यह सामान्य रूप से गैर-अस्थिर वाले समेत किसी भी अन्य चर के साथ संग्रहीत किया जाता है। अगर कुछ संकलक स्मृति के कुछ विशेष खंड में अस्थिर चर को स्टोर करने का निर्णय लेते हैं - ऐसा करने से रोकने के लिए कुछ भी नहीं है। लेकिन भाषा स्तर पर इसके लिए बिल्कुल कोई कारण नहीं है।

आप ऐसे प्रश्न क्यों पूछ रहे हैं? आपको क्या लगता है कि स्मृति के कुछ विशेष खंड में संग्रहीत किया जाना चाहिए?

9

सी volatile में बस संकलक को बताता है - "आपके पास इस चर के मान को मानने के लिए पर्याप्त ज्ञान नहीं है"। इसके लिए कोई "खंड" नहीं है जैसे बीएसएस, सीएसएस।

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

यहां एक अच्छी व्याख्या दी गई है: http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

+0

अनुकूलन करते समय, जहां से कंपाइलर को यह मान लिया जाएगा? मेरा मतलब स्मृति का कौन सा हिस्सा है? – kapilddit

+1

यह निर्भर करता है, आमतौर पर संकलक "याद करता है" कि मान एक सीपीयू रजिस्टर में है। अस्थिरता संकलक को कभी भी उस धारणा को बनाने के लिए मजबूर नहीं करती है, और प्रत्येक पहुंच (आमतौर पर मुख्य स्मृति से) मान को फिर से लोड करती है। – Justicle

21

volatile एक type qualifier नहीं एक storage class specifier है, इसलिए यह बिल्कुल भंडारण स्थान निर्धारित नहीं करता है; यह एक चर के प्रकार की परिभाषा को प्रभावित करता है, न कि इसके भंडारण।

यह बस संकलक बलों को स्पष्ट रूप से नहीं बल्कि यह सोचते हैं कि उदाहरण के लिए एक रजिस्टर में कुछ पूर्व में पढ़ी गई मान मान्य रहता है की तुलना में एक चर जिसका प्रकार है volatile चर के भंडारण स्थान से पढ़ने के लिए (जहां कि हो सकता है)।

4

अस्थिरता भंडारण वर्ग से निपटने के लिए कुछ भी नहीं है।

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

तो वैरिएबल को अस्थिर घोषित करके .. यह गारंटी देता है कि आपको नवीनतम मूल्य मिलेगा, जिसे बाहरी घटना द्वारा बदला जा सकता है।

यदि आपका कोड अस्थिर के रूप में घोषित नहीं किया गया है, तो आपका कोड ठीक काम कर सकता है, लेकिन कभी-कभी सही मूल्य नहीं मिलने का मौका हो सकता है .. ताकि हम चर को अस्थिर घोषित कर सकें।

बाहरी घटनाओं से निपटने के दौरान आमतौर पर हार्डवेयर संबंधित पिनों के इंटरप्ट्स जैसे अस्थिरता का उपयोग किया जाता है।

उदाहरण। एडीसी मूल्यों को पढ़ना।

कॉन्स्ट वोल्टाइल का अर्थ आप कोड में उस चर के मान को संशोधित या परिवर्तित नहीं कर सकते हैं। केवल बाहरी घटना मूल्य बदल सकती है।

नियंत्रक पिन आमतौर पर अस्थिर के रूप में परिभाषित होते हैं। परिवर्तनीय घोषित करके हो सकता है क्योंकि अस्थिर नियंत्रक "पिन द्वारा पढ़ा" नहीं करेगा "लच द्वारा पढ़ा नहीं गया" ... यह मेरी धारणा है। गलत हो सकता है ...

लेकिन अभी भी भ्रम की बहुत सारी है जब अस्थिर रूप में चर का चयन करने के ..

एक चर अस्थिर घोषित किया जाना चाहिए जब भी अपने मूल्य में अप्रत्याशित रूप से बदल सकता है। अभ्यास में, चर के केवल तीन प्रकार को बदल सकता है:

  1. मेमोरी-मैप किया परिधीय रजिस्टर

  2. वैश्विक व्यवधान सेवा नियमित

  3. वैश्विक चर एक मल्टी-थ्रेडेड आवेदन

    भीतर द्वारा संशोधित चर

लिंक: http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

तो यह वैरिएबल को ऐसे मामलों में अस्थिर के रूप में पेश किया जाता है।

1

"वोल्टाइल" का उपयोग सी/सी ++ विनिर्देशों में स्मृति मैप किए गए उपकरणों के उपयोग की अनुमति देने के लिए किया गया था। यह संकलक को निर्देशित करता है कि इस कीवर्ड के साथ परिभाषित चर को अनुकूलित न करें, सिर्फ इसलिए कि परिवर्तक कंपाइलर-दृश्य कोड में अपना राज्य नहीं बदलता है।

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