मैं समझता हूं कि एक रजिस्टर कीवर्ड मूल्य की गणना करने के लिए एक रजिस्टर असाइन करेगा और एक अस्थिर कीवर्ड हर बार स्मृति से मूल्य पढ़ेगा जब हम चर पर कुछ गणना करते हैं और मूल रूप से कोड को अनुकूलित नहीं करते हैं। इसलिए, यदि एक चर को इन दोनों कीवर्ड को असाइन किया गया है, तो इसका मतलब यह होगा कि यह अनिवार्य रूप से अस्थिर हो जाएगा? मैं एक नमूना कोड लिखकर व्यवहार को समझ नहीं सकता। क्या कोई कुछ प्रकाश डाल सकता है?सी में "अस्थिर int i रजिस्टर" कैसे व्यवहार करेगा?
उत्तर
सी में, register
भंडारण वर्ग, auto
भंडारण वर्ग के रूप में वास्तव में बर्ताव करता है, सिवाय इसके कि कार्यान्वयन अगर कार्यक्रम लेने के लिए या वस्तु के पते का उपयोग करने का प्रयास करता एक नैदानिक जारी करने के लिए (5.1.1.3 प्रति) की आवश्यकता है (6.5 .3.2, 6.7.1)। register
का उपयोग संकलक को ऑप्टिमाइज़ेशन संकेत के रूप में आमतौर पर व्यर्थ है, क्योंकि ऑब्जेक्ट की गैर-संग्रहित गुणवत्ता का फायदा उठाने के लिए पर्याप्त एक कंपाइलर स्मार्ट निश्चित रूप से पर्याप्त है कि कौन से ऑब्जेक्ट्स register
घोषित किए जा सकते हैं; इसके बजाए, इसे कोड गुणवत्ता जांच के रूप में समझा जाना चाहिए कि प्रोग्रामर वस्तु के पते को अनजाने में ऑप्टिमाइज़ेशन अवसरों को नष्ट नहीं कर रहा है।
दूसरे शब्दों में, किसी वैध प्रोग्राम से कीवर्ड के सभी उदाहरणों को हटाकर प्रोग्राम के अर्थशास्त्र पर कोई प्रभाव नहीं है; यह static_assert
के संबंध में इसी तरह है।
volatile
प्रकार क्वालिफ़ायर इंगित करता है कि ऑब्जेक्ट को साइड इफेक्ट्स (पढ़ने और लिखने) तक पहुंच माना जाता है और इसे अनुकूलित नहीं किया जा सकता है। एक वस्तु के लिए है कि एक निर्धारित स्थान स्मृति (यानी, एक register
भंडारण वर्ग वाले), इस प्रदर्शन परीक्षण में सबसे उपयोगी होगा में मौजूद नहीं है:
start = time();
for (multiple loops)
register volatile int result = test_function();
stop = time();
elapsed = stop - start;
मुझे उत्सुकता है कि आपके उदाहरण में 'अस्थिर रजिस्टर' कैसे आसानी से 'अस्थिर' से अलग है? – dasblinkenlight
@dasblinkenlight में कोई फर्क नहीं पड़ता है, क्योंकि प्रोग्राम मान्य है। – ecatmur
अस्थिर कीवर्ड का एक और समझने योग्य दृश्य यह है कि यह संकलक को बताता है कि जब भी चर निर्दिष्ट किया जाता है, तो संकलक को यह मानना चाहिए कि चर किसी अन्य प्रक्रिया या धागे या डिवाइस द्वारा बदला जा सकता है। ऑप्टिमाइज़ करते समय कंपाइलर्स यह मानकर बार-बार एक वैरिएबल तक पहुंच को समाप्त कर सकते हैं कि यदि चर मूल्य को रजिस्टर में लोड किया गया है, तो रजिस्टर में मान को मूल्य की वर्तमान प्रति के रूप में निर्भर किया जा सकता है जब तक कि संकलक को स्रोत कोड नहीं मिलता है जो परिवर्तनीय को संशोधित करता है । अस्थिर संकलक को बताता है कि यह धारणा मान्य नहीं है। –
volatile
मतलब यह है कि वस्तु एक तरह से बदल सकते हैं कि संकलक के लिए अप्रत्याशित है और register
का अर्थ है कि इसका पता नहीं लिया जा सकता है।
दोनों का संयोजन सही मायने में बनाता है, जब वस्तु वास्तव में मंच पर हार्डवेयर रजिस्टर होती है। कुछ कंपाइलर्स (उदा। जीसीसी) में ऐसे चर को एक विशिष्ट हार्डवेयर रजिस्टर में ठीक करने के लिए एक्सटेंशन भी होते हैं।
कुछ अन्य कोड ऐसे हार्डवेयर रजिस्टर को बदल सकते हैं, और इसलिए संकलक वर्तमान मान के बारे में कुछ भी नहीं मान सकता है। ऐसे मामले में यह const
क्वालीफायर जोड़ने का भी अर्थ होगा। जीसीसी के विस्तार के साथ, उदा,
register uint32_t volatile const eax __asm__("eax");
आप किसी भी क्षण में eax
रजिस्टर का निरीक्षण करने के लिए एक उपकरण होगा, लेकिन आप दुर्घटना से इसे बदलने के लिए सक्षम नहीं होगा।
'अस्थिर' का अर्थ यह भी है कि वेरिएबल को सभी लिखना वास्तव में होना चाहिए। –
@ टोरक्लिंगबर्ग, 'रजिस्टर' चर के लिए "लिखने" से आपका क्या मतलब है। इस तरह के चर के लिए "भंडारण" का कोई मॉडल नहीं है, और इसलिए "पढ़ने" या "लिखने" का कोई मॉडल नहीं है। –
क्या प्लेटफ़ॉर्म और कंपाइलर? मुझे नहीं लगता कि ज्यादातर सामान्य कंपाइलर (जैसे कि डिफ़ॉल्ट कॉन्फ़िगरेशन में जीसीसी) 'रजिस्टर' का सम्मान करेंगे। – Joe
'रजिस्टर' का एक प्रभाव यह होना चाहिए कि आप इस तरह घोषित वैरिएबल का पता नहीं ले सकते हैं। –
@ डैनियल: मुझे आपकी बात समझ में नहीं आया .. वैरिएबल का पता क्यों ले सकता है? क्या आप कहने का मतलब है कि इसे एक पॉइंटर द्वारा एक्सेस किया जा सकता है? – knightofhorizon