मैं एक एम्बेडेड सी डेवलपर हूं जिसने हाल ही में एक एम्बेडेड डिवाइस पर सी ++ कोड के साथ गड़बड़ करना शुरू कर दिया है और इस बारे में अनिश्चित हूं कि क्लास अस्थिर डेटा जैसे स्मृति के रूप में कैसे उपयोग करता है एक बाहरी डिवाइस पर मैप किए गए रजिस्ट्रार या डेटा, जैसे एनालॉग-टू-डिजिटल कनवर्टर (एडीसी)।सी ++ अस्थिर और बाहरी डेटा एसेस के साथ कॉन्स्ट-शुद्धता
उदाहरण के लिए, मैं एक सूचक के माध्यम से अपनी स्मृति-मैप किया रजिस्टरों एक्सेस करके कक्षाएं डिवाइस के हार्डवेयर मॉड्यूल है कि इंटरफेस है, तो जैसे:
class IOPin
{
public:
/* Constructor, destructor, other methods...*/
// should this be a const method?
bool ReadIOState() {return portregs_->state;}
private:
/* Other private stuff...*/
// Constructor points this to the right set of memory-mapped registers
volatile struct portregs_t
{
uint32_t control;
uint32_t state;
uint32_t someotherreg;
} *portregs_;
};
रजिस्टर नाम निश्चित रूप से की खातिर बने होते हैं उदाहरण। मैं किसी भी व्यक्ति के लिए माइक्रोचिप पीआईसी 32 डिवाइस का उपयोग कर रहा हूं जो उत्सुक है।
मेरी संभावित गलत समझ से, const
विधि को चिह्नित करने का अर्थ है कि ऑब्जेक्ट की देखने योग्य स्थिति को कॉलर के संबंध में तब तक नहीं बदला जाना चाहिए। तो ReadIOState()
विधि const
हो क्योंकि यह volatile
डेटा तक पहुंच सकता है जो किसी भी समय बदल सकता है और इस प्रकार कॉलर परिवर्तन का निरीक्षण करेगा? या यह const
होना चाहिए क्योंकि विधि स्पष्ट रूप से कुछ भी नहीं बदल रहा है?
वर्तमान में, मैं प्रश्न में बताए गए कारण के लिए const
बनाने की दिशा में झुका रहा हूं। this GotW article पर ठोकर खाने के बाद यह विशेष रूप से सच है, जिसमें कहा गया है कि const
का अर्थ "समवर्ती रूप से पढ़ने में सक्षम" है। मेरा एम्बेडेड एप्लिकेशन एकल-थ्रेडेड है, लेकिन मुझे लगता है कि सामान्य रूप से const
नेस के लिए एक अच्छा लिटमस परीक्षण हो सकता है।
इसके अलावा, कंपाइलर const
विधियों का इलाज कैसे करता है? यही कारण है, क्या होता है जब मैं इस तरह आईओ के राज्य मतदान करना चाहते हैं:
// wait for IO pin to go high
while(!myIOpin.ReadIOState())
{}
तो ReadIOState()
const
है, तो संकलक एक कॉल के बाद दिए गए मान पुन: उपयोग या यह बहुत चालाक को देखने के लिए यह है कि कर सकते हैं volatile
डेटा तक पहुंच रहा है और ऐसा नहीं?
मुझे आश्चर्य है कि क्या आप अस्थिर तरीकों को उसी तरह बना सकते हैं जैसे आप कॉन्स्ट विधियां बना सकते हैं। –
शून्य परीक्षण() अस्थिर {} VS2012 पर संकलित करता है लेकिन मुझे नहीं पता कि इसका क्या अर्थ है क्योंकि मैंने कभी पहले अस्थिरता का उपयोग नहीं किया है। –
@NeilKirk हां, आप इसे कर सकते हैं। इसका मतलब है कि फ़ंक्शन को 'अस्थिर' उदाहरण पर लागू किया जा सकता है। 'कॉन्स्ट' उदाहरणों पर' कॉन्स्ट 'फ़ंक्शंस की तरह ही लगाया जा सकता है। यदि आपको ऐसा लगता है तो आप सदस्य फ़ंक्शन के सभी 4 अधिभार भी प्राप्त कर सकते हैं। – Angew