2012-02-29 5 views
20

कोड का निम्न भाग पर विचार करें। हालांकि, जी ++ "शून्य-शून्य" परीक्षण को हटा देता है और अंतहीन पाश में थोड़ी देर लूप का अनुवाद करता है।जी ++ को एक चर द्वारा नियंत्रित लूप को अनुकूलित करने से कैसे रोकें जिसे आईआरक्यू द्वारा बदला जा सकता है?</p> <pre><code>unsigned global; while(global); </code></pre> <p><code>global</code> एक समारोह जो एक IRQ से शुरू हो जाती है में संशोधित किया गया है:

कंपाइलर अनुकूलन को अक्षम करने से समस्या हल हो जाती है, लेकिन क्या सी ++ इसके लिए एक भाषा निर्माण प्रदान करता है?

+0

@ Styne666: शीर्षक प्रश्न – Necrolis

+0

यह भी देखें http://stackoverflow.com/q/7083482/594137 –

+0

@ Styne666 - यह कोड लिखने के लिए कोई अच्छा अभ्यास नहीं है जिसे काम करने के लिए एक विशिष्ट कंपाइलर कॉन्फ़िगरेशन की आवश्यकता होती है। इस प्रकार, अनुकूलन को अक्षम करना उत्पादन कोड के लिए कोई विकल्प नहीं है। – 0xbadf00d

उत्तर

17

volatile के रूप में चर घोषित करें:

volatile unsigned global; 

यह कीवर्ड कि संकलक कि global अलग धागे में संशोधित किया जा सकता है और सभी अनुकूलन इसके लिए बंद कर दिया जाना चाहिए बताता है।

+1

शायद "कुछ अनुकूलन" को "कुछ अनुकूलन" में बदल दें, क्योंकि अभी भी कई अनुकूलन लागू किए जा सकते हैं। उदाहरण के लिए, 'वैश्विक = 5 + 6;' में, आपका कथन यह इंगित कर सकता है कि '5 + 6' कम नहीं किया गया है। –

+2

अस्थिर-क्वालीफायर जोड़ना बनाए गए ऑपोड को नहीं बदलता है। यह अभी भी एक अंतहीन पाश में अनुवाद करता है ... – 0xbadf00d

+0

@SaschaHoll हाँ यह करता है। आप एक अलग थ्रेड पर 'global' '0' सेट कर सकते हैं, और लूप समाप्त हो जाएगा। –

0

आप जीसीसी एक समारोह प्रति आधार पर अनुकूलन अक्षम करने के समारोह घोषणा पर विशेषताओं का उपयोग कर सकते हैं:

void myfunc() __attribute__((optimize(0))); 

अधिक जानकारी के लिए GCC Function Attributes पेज देखें।

while(global) 
    asm volatile("" : "+g"(global)); 

यह वह जगह है:

+0

यदि चर को स्मृति के एक विशिष्ट खंड में होना चाहिए तो इसे सही ढंग से रखने के लिए 'सेक्शन' [वैरिएबल एट्रिब्यूट] (http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html) का उपयोग करें। आपको इसे 'अस्थिर' के रूप में चिह्नित करने की भी आवश्यकता हो सकती है। –

7

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

और क्योंकि शरीर खाली है और बाधा ने इसे सबसे सामान्य उपलब्ध कराया है, इसे सभी प्लेटफार्मों पर विश्वसनीय रूप से काम करना चाहिए जहां जीसीसी इनलाइन असेंबली का समर्थन करता है।

+0

मैं पुष्टि कर सकता हूं कि यह चाल वास्तव में काम करती है! धन्यवाद। –

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