2012-11-03 12 views
5

एक छोटा सा चित्रकारी सी प्रोग्राम क्या है जो पृथक्करण में अस्थिर और अस्थिर के बीच का अंतर दर्शाता है?उदाहरण सी कोड जो disassembly में अस्थिर प्रदर्शन करता है?

यानी

int main() 
{ 
    volatile int x; 

    ??? 
} 

बनाम

int main() 
{ 
    int x; 

    ??? 
} 

क्या हम इस तरह के साथ दोनों ??? की जगह ले सकता है कि तैयार किए गए कोड अलग है?

x = 0; 

तो xvolatile नहीं है, संकलक है कि यह अप्रयुक्त देखेंगे और शायद इसे समाप्त करेंगे (या तो x = 0; बयान या यहाँ तक कि चर ही) पूरी तरह से एक के रूप में तैयार किए गए कोड से:

उत्तर

7
उदाहरण के लिए

अनुकूलन।

हालांकि, volatile कीवर्ड वास्तव में संकलक को ऐसा करने से रोकने के लिए है। यह मूल रूप से कोड जनरेटर को बताता है "जो भी आपको लगता है कि यह चर है/करता है, मुझे दूसरा अनुमान नहीं है, मुझे इसकी आवश्यकता है।" तो फिर संकलक अस्थिर चर का उपयोग करने के रूप में उपयोग करेगा और यह अभिव्यक्ति से संबंधित वास्तविक कोड उत्सर्जित करेगा।

+0

मैंने अभी इसका परीक्षण किया और आप सही हैं। स्टोर 'x = 0' gcc -O2 में nonvolatile संस्करण में समाप्त हो गया है, जबकि यह अस्थिर संस्करण के साथ नहीं है। –

+0

"आप सही हैं" - मैं हमेशा सही हूं। (जेके): पी आपका स्वागत है। –

+2

यह विशिष्ट से सामान्य तक "जल्दबाजी सामान्यीकरण" फॉलसी है। :) –

2

यह सबसे छोटा उदाहरण नहीं हो सकता है, लेकिन अगर volatile नहीं किया जाता है यह, एम्बेडेड सिस्टम में volatile का एक आम फायदा नहीं है एक रजिस्टर का पता करने के लिए x अंक संभालने,, संकलक x नहीं करता है के मूल्य को समझेंगे 'टी बदल सकते हैं और पाश निकाल देगा:

volatile long *x = (long*) REGISTER_BASE; 
while (!(x&0x01)) { 
    //do nothing; 
} 
0

आप भी इस कोशिश कर सकते हैं:

x=1; 
x=2; 
return x; 

अनुकूलन एक chec चालू दोनों के लिए disassembly के।

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