क्या एक संरचनात्मक अस्थिरता अपने सभी सदस्यों को अस्थिर बनाती है?


96

अगर मेरे पास:

struct whatever {
int data;
};
volatile whatever test;
होगा test.dataभी अस्थिर हो?


4
बहुत बढ़िया सवाल। मैंने पढ़ा कि एक volatileसदस्य फ़ंक्शन केवल thisपॉइंटर को अस्थिर बनाता है , इसलिए सदस्यों को हर बार मेमोरी से पढ़ा जाएगा कि वे एक्सेस कर रहे हैं लेकिन "आधिकारिक तौर पर" अस्थिर नहीं हैं।
अलेक्जेंड्रे सी।

2
संभवतः एक डुप्लिकेट , लेकिन फिर भी एक अच्छा सवाल।
सर्गेई टैचेनोव

जवाबों:


119

एक और प्रश्न पूछा जा सकता है (या मूल प्रश्न को देखने का एक और तरीका):

क्या एक संरचना constबनाने से इसके सभी सदस्य बन जाते हैं const?

अगर मेरे पास:

struct whatever { int data; };

const whatever test;

Test.data constभी होगा?

मेरा उत्तर है: हाँ। यदि आप किसी प्रकार की वस्तु घोषित whateverकरते हैं constतो उसके सभी सदस्य constभी होंगे

इसी प्रकार, यदि आप प्रकार का ऑब्जेक्ट की घोषणा whateverके साथ volatileतो अपने सभी सदस्य होंगे volatileभी, अगर आप के साथ वस्तु की घोषणा की तरह constहै, यह के सभी सदस्य हो जाएगा constभी।

constऔर volatileएक ही सिक्के के दो चेहरे हैं; वे ऐसा कर रहे हैं कि मानक अक्सर उन्हें संदर्भित करता है cv-qualifiers


मानक से उद्धरण ($ 7.1.5.1 / 8)

[नोट: अस्थिरता ऑब्जेक्ट को शामिल करने वाले आक्रामक अनुकूलन से बचने के लिए कार्यान्वयन के लिए एक संकेत है क्योंकि ऑब्जेक्ट के मूल्य को एक कार्यान्वयन द्वारा अवांछनीय द्वारा बदला जा सकता है। विस्तृत शब्दार्थ के लिए 1.9 देखें। सामान्य तौर पर, वाष्पशील के शब्दार्थ C + + में समान होते हैं क्योंकि वे C में होते हैं]

इसका मतलब है, यदि आपकी वस्तु किसी संरचना का उदाहरण है, तो संकलक आक्रामक अनुकूलन को वस्तु से नहीं जोड़ सकता , जब तक कि वह इसके प्रत्येक सदस्य के आक्रामक अनुकूलन से बच नहीं जाता है। (अन्यथा, यह ऑब्जेक्ट को शामिल करने वाले अनुकूलन से कैसे बच सकता है?)


संबंधित विषय:

हम C ++ में वाष्पशील कीवर्ड का उपयोग क्यों करते हैं?


यह ध्यान रखना महत्वपूर्ण है कि कब्ज को केवल तत्काल याद करने के लिए प्रचारित किया जाता है। यदि आपका ढांचा किसी वस्तु के लिए एक संकेतक रखता है, तो सूचक स्वयं कांस्ट हो जाएगा (जैसे। आप इसे पुन: असाइन नहीं कर पाएंगे), लेकिन आप इंगित की जा रही वस्तु को बदल पाएंगे। (यह मानते हुए कि आपकी संरचना कब्ज के लिए एक संकेतक को नहीं रोक रही है)
पाब्लो एरियस

-2

प्रेषक: http://msdn.microsoft.com/en-us/library/145yc477%28v=vs.80%29.aspx

पॉइंटर द्वारा बताई गई वस्तु को कास्ट या वाष्पशील घोषित करने के लिए, फॉर्म की घोषणा का उपयोग करें:

const char *cpch;
volatile char *vpch;

पॉइंटर के मूल्य को घोषित करने के लिए - अर्थात, पॉइंटर में संग्रहीत वास्तविक पता - कॉन्स्टेबल या अस्थिर के रूप में, फॉर्म की घोषणा का उपयोग करें:

char * const pchc;
char * volatile pchv;

3
प्रश्न का उत्तर नहीं
जैकब वैन बेथलेहम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.