2015-03-13 8 views
11

मैं एक सी ++ एमएफसी प्रोजेक्ट की समीक्षा कर रहा हूं। कुछ फाइलों की शुरुआत में यह लाइन है:क्यों #pragma अनुकूलन ("", बंद)

#pragma optimize("", off) 

मुझे लगता है कि यह सभी निम्न कार्यों के लिए अनुकूलन बंद कर देता है। लेकिन प्रेरणा आम तौर पर ऐसा करने के लिए क्या होगी?

+4

प्रोग्रामर बम होने पर प्रोग्रामर को विश्वसनीय स्टैक ट्रेस पसंद आया। शायद वह एक कोड अनुकूलक बग के आसपास काम करने की कोशिश की। शायद वह नहीं जानता था कि वह क्या कर रहा था और कार्गो पंथ लागू किया था। –

+0

परिणामस्वरूप बाइनरी को खराब करने का एक और कारण होगा। रिवर्स इंजीनियरिंग को कठिन बनाने के लिए (बेशक अगर स्रोत कोड खुला है तो यह व्यर्थ है)। – freakish

उत्तर

11

मैंने उत्पादन कोड देखा है जो सही है लेकिन इतना जटिल है कि यह ऑप्टिमाइज़र को गलत आउटपुट बनाने में भ्रमित करता है। यह ऑप्टिमाइज़ेशन बंद करने का कारण हो सकता है।

हालांकि, मैं इसे और अधिक संभावना मानता हूं कि कोड बस खराब है, जिसमें अनिर्धारित व्यवहार है। ऑप्टिमाइज़र उसको उजागर करता है और गलत रनटाइम व्यवहार या क्रैश की ओर जाता है। अनुकूलन के बिना, कोड "काम" होता है। और अंतर्निहित समस्या को ढूंढने और निकालने के बजाय, किसी ने इसे ऑप्टिमाइज़ेशन को अक्षम करके इसे छोड़कर "निश्चित" किया है।

बेशक, यह नाजुक और कामकाज के बारे में है। नया हार्डवेयर, नया ओएस पैच, नया कंपाइलर पैच, इनमें से कोई भी इस तरह के "फिक्स" को तोड़ सकता है।

भले ही प्रज्ञा पहले कारण के लिए है, तो इसे भारी दस्तावेज किया जाना चाहिए।

+0

धन्यवाद। उन पंक्तियों के आसपास कोई दस्तावेज नहीं। मुझे लगता है कि मैं उन्हें हटाने और साइड इफेक्ट्स के लिए नजर रखने का प्रयास करूंगा। – Stokke

8

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

4

मुझे पता है कि यह एक पुराना विषय है, लेकिन मैं यह भी जोड़ूंगा कि इस निर्देश का उपयोग करने का एक अन्य कारण है - हालांकि अधिकांश एप्लिकेशन डेवलपर्स के लिए प्रासंगिक नहीं है।

डिवाइस ड्राइवर या अन्य निम्न-स्तरीय कोड लिखते समय, ऑप्टिमाइज़र कभी-कभी आउटपुट उत्पन्न करता है जो हार्डवेयर से सही तरीके से बातचीत नहीं करता है।

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

यह भी बता सकता है कि क्यों (एंग्यू नोट्स के रूप में) इस निर्देश का उपयोग स्पष्ट रूप से दस्तावेज किया जाना चाहिए।

4

कोड आधार में होने का एक और वैकल्पिक कारण ... यह एक दुर्घटना है।

डीबगिंग के दौरान एक विशिष्ट फ़ाइल पर ऑप्टिमाइज़र को बंद करने के लिए यह एक बहुत ही आसान टूल है - जैसा ऊपर वर्णित रे है।

यदि परिवर्तन करने से पहले चेंजलिस्ट की समीक्षा नहीं की जाती है, तो इन लाइनों के लिए कोडबेस में अपना रास्ता बनाना बहुत आसान है, क्योंकि वे अन्य परिवर्तन किए जाने पर भी 'गलती से' थे।

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