मुझे नहीं लगता कि कोई प्रदर्शन अंतर है। दरअसल जेनरेट कोड वही होगा और -g
प्रलेखन here के अनुसार -O
के साथ प्रयोग योग्य है। इसके अलावा, डिबगिंग प्रतीकों को कोड में नहीं लिखा जाता है, लेकिन "डीबग सेक्शन" नामक किसी अन्य खंड में, जिसे रनटाइम पर भी लोड नहीं किया जाता है (केवल डीबगर द्वारा)
-g
क्या अनुकूलन नहीं चलाएगा, या कोड उत्पन्न नहीं होगा ।
शॉर्टकट अनुकूलित कोड द्वारा लिया कभी कभी आश्चर्य की बात हो सकती है:: यह जीसीसी नीति में कहा गया है here
के रूप में हालांकि यह नोट करना ही प्रलेखन कहा गया है कि कि उपयोगी हो सकता है है कुछ चर आप घोषित नहीं हो सकता बिल्कुल मौजूद है; नियंत्रण का प्रवाह संक्षिप्त रूप से स्थानांतरित हो सकता है जहां आपने इसकी अपेक्षा नहीं की थी; कुछ कथन निष्पादित नहीं हो सकते हैं क्योंकि वे निरंतर परिणाम गणना करते हैं या उनके मान पहले से ही हाथ में हैं; कुछ कथन विभिन्न स्थानों में निष्पादित हो सकते हैं क्योंकि उन्हें लूप से बाहर ले जाया गया है। फिर भी अनुकूलित आउटपुट डीबग करने के लिए यह संभव है। यह उन प्रोग्राम्स के लिए ऑप्टिमाइज़र का उपयोग करना उचित बनाता है जिनमें बग हो सकती है।
तो अंत में डिबगिंग आपका अनुकूलन चोट कभी नहीं होगा, लेकिन विपरीत झूठे और -O3
का उपयोग कर (उदाहरण के लिए बेकार चर हटा कर) अपने डीबगिंग जानकारी में कमी आ सकती है।
नोट यह बाद से यह होगा (कहा गया है here) -Og
उपयोग करने के लिए उस मामले में बेहतर हो सकता है कि:
अनुकूलन डीबगिंग अनुभव। -ऑग अनुकूलन सक्षम करता है जो डीबगिंग में हस्तक्षेप नहीं करता है। यह मानक संपादन-संकलन-डीबग चक्र के लिए अनुकूलन स्तर होना चाहिए, तेजी से संकलन और एक अच्छा डिबगिंग अनुभव बनाए रखने के दौरान अनुकूलन के उचित स्तर की पेशकश करता है।
हालांकि यह प्रदर्शन को प्रभावित करेगा क्योंकि कुछ ऑप्टिमाइज़ेशन पास करता है जो डिबगिंग में हस्तक्षेप करेगा।
संपादित करें:
लिंक और कोटेशन gcc
यह करने के लिए अपने सवाल का जवाब इस तरह के clang
के रूप में अन्य compilers पर लागू नहीं हो सकता है। हालांकि मुझे clang
के लिए कुछ दस्तावेज भी मिला है। उदाहरण here के लिए:
असल में, डिबग जानकारी आप के साथ "-O0 जी" एक कार्यक्रम संकलन और मिल पूर्ण डिबग जानकारी है, तो आप मनमाने ढंग से कार्यक्रम को संशोधित करने के रूप में यह एक डिबगर से कार्यान्वित की इजाजत दी की अनुमति देता है । "-O3 -g" के साथ एक प्रोग्राम को संकलित करना आपको पूर्ण डीबग जानकारी देता है जो हमेशा पढ़ने के लिए उपलब्ध और सटीक है (उदाहरण के लिए, आपको पूंछ कॉल उन्मूलन और इनलाइनिंग के बावजूद सटीक स्टैक निशान मिलते हैं), लेकिन आप खो सकते हैं प्रोग्राम को संशोधित करें और कॉल फ़ंक्शन जहां प्रोग्राम से अनुकूलित किया गया था, या पूरी तरह से रेखांकित किया गया था।
'-g' के साथ संकलित एक प्रोग्राम की तुलना करें और '-g' के बिना संकलित एक ही प्रोग्राम की तुलना करें। आपको वास्तविक जेनरेट कोड में कोई अंतर नहीं दिखना चाहिए। –
@ जोचिमपिलबोर्ग: तथ्य यह है कि मुझे किसी विशिष्ट कार्यक्रम के लिए उत्पन्न कोड में कोई अंतर नहीं दिखता है, इसका मतलब यह नहीं है कि कभी भी कोई फर्क नहीं पड़ता ... – einpoklum
कड़ाई से देखा गया: हां, कम से कम जब आप निष्पादन योग्य के भीतर डिबगिंग प्रतीक रखते हैं , क्योंकि इसका मतलब है कि लोड करने के लिए और अधिक है (या लोड होने के दौरान छोड़ें)। यह आईएमओ अभ्यास में नगण्य है, यद्यपि। –