2010-05-04 14 views
5

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

वर्तमान में शीर्षलेख में परिभाषित किया गया है, जो सेटिंग के आधार पर एक निर्माता को चालू या बंद करता है। इसलिए यह निश्चित रूप से एक एनओओपी है, जब बंद हो जाता है। मैं सोच रहा हूं, अगर मेरे पास निम्न कोड है, यदि एक कंपाइलर (एमएसवीएस/जीसीसी) फ़ंक्शन कॉल को अनुकूलित करने में सक्षम है, तो यह फिर से एक एनओओपी है। (ऐसा करने से, स्विच .cpp में हो सकता है और स्विचिंग बहुत तेज़, संकलित/समयबद्ध रूप से लिंक हो जाएगा)।

--Header-- 
void printDebug(const Basic* p); 

class Basic { 
    Basic() { 
     simpleSetupCode; 

     // this should be a NOOP in release, 
     // but constructor could be inlined 
     printDebug(this); 
    } 
}; 
--Source-- 
// PRINT_DEBUG defined somewhere else or here 
#if PRINT_DEBUG 
void printDebug(const Basic* p) { 
    // Lengthy debug print 
} 
#else 
void printDebug(const Basic* p) {} 
#endif 

उत्तर

2

इस तरह सभी सवालों के साथ होता है, इस सवाल का जवाब है - अगर यह वास्तव में आपके लिए महत्वपूर्ण है, तरीके का प्रयास करें और उत्सर्जित विधानसभा भाषा जांच करते हैं।

+11

शैतान के वकील: क्या इस साइट पर बड़ी संख्या में प्रश्नों को शामिल नहीं किया गया है? लोग यहाँ क्यों आते हैं? क्योंकि वे नहीं जानते हैं। और क्योंकि वे या तो नहीं जानते कि कैसे पता लगाना है (इस मामले में शायद वे असेंबली नहीं बोलते हैं), या वे बहुत आलसी हैं या ऐसा करने में जल्दी हैं। मेटा-प्रश्न: क्या हम आलसी/जल्दी लोगों को पट्टी करना चाहते हैं और केवल नली का उत्तर देना चाहते हैं जो वास्तव में नहीं जानते? कुछ अक्सर पूछे जाने वाले प्रश्नों से उलझन में पड़ सकते हैं (और उन पर छोड़ सकते हैं); कुछ मूल रूप से एक ही प्रश्न के लिए बार-बार पिंट्स प्राप्त करना पसंद कर सकते हैं। ओपी को कम से कम इस साइट (या google) की खोज की जानी चाहिए, हालांकि – Mawg

+0

@mawg इसमें इस साइट के बहुत सारे उपयोग शामिल हैं, और मेरी राय है कि शायद यहां पोस्ट किए गए 50% प्रश्नों से नहीं पूछा जाना चाहिए। इसे विशेष रूप से बार-बार पूछा जाता है और मेरा जवाब ईमानदार है - हम यह नहीं बता सकते कि आपका अनुकूलक आपके कोड के साथ क्या करने जा रहा है, केवल आप ही ऐसा कर सकते हैं। –

+6

(-1) तो फिर आपका उत्तर उपयोगकर्ता को वास्तव में "उपयोगी" नहीं है। आपने वास्तव में उनके प्रश्नों का उत्तर नहीं दिया है, भले ही यह एक उचित प्रश्न था या नहीं। वास्तव में, आपने डुप्लिकेट के रूप में बंद करने के लिए वोट नहीं दिया था। अगर मैं पूछता हूं कि "2 + 2 क्या है" और आप कहते हैं "इसे अपने लिए समझें" तो आप * सहायक नहीं हैं * और आप * सही * नहीं हैं। यह सच है कि मुझे इसे अपने लिए समझना चाहिए, लेकिन आपने ** मुझे उत्तर नहीं दिया है। आपकी प्रतिक्रिया एक टिप्पणी होनी चाहिए। – DevinB

1

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

 
#define PRINT_DEBUG // optional 
#ifdef PRINT_DEBUG 
#define PRINT_DEBUG_CALL(p) printDebug(p) 
#else 
#define PRINT_DEBUG_CALL(p) 
#endif 


void printDebug(const Basic* p); 

class Basic { 
    Basic() { 
     simpleSetupCode; 

     // this should be a NOOP in release, 
     // but constructor could be inlined 
     PRINT_DEBUG_CALL(this); 
    } 
}; 
--Source-- 
// PRINT_DEBUG defined somewhere else or here 
#if PRINT_DEBUG 
void printDebug(const Basic* p) { 
    // Lengthy debug print 
} 
#endif 
+0

वास्तव में क्या उपयोग किया जाता है। लेकिन एक परियोजना recompile मुद्दों को परिभाषित करने के उपयोग से आगे और पीछे स्विचिंग। – Dodo

+0

वास्तव में, यह आपके कोड के अनुसार उपयोग नहीं किया जाता है। मेरे संस्करण में, printDebug फ़ंक्शन और उस पर कॉल प्रोग्राम में मौजूद नहीं है, जब PRINT_DEBUG परिभाषित नहीं किया गया है। Recompiling के बारे में, हाँ, दोनों संस्करणों को recompiling की आवश्यकता है। लेकिन आप संकलक के बिना रिक्त फ़ंक्शन कॉल को अनुकूलित करने की अपेक्षा नहीं कर सकते हैं ... –

+0

मुझे खेद है कि मैं अस्पष्ट हूं। प्रश्न में मैंने जो कोड लिखा है, वह मेरे प्रोजेक्ट के भीतर बेसिक क्लास द्वारा कोड का उपयोग नहीं है। हालांकि, आपके द्वारा प्रदान किया गया कोड मूल रूप से मेरे प्रोजेक्ट के भीतर मूल वर्ग की वर्तमान स्थिति के बराबर कोड है। प्रश्न में दिए गए कोड के साथ, ध्वज PRINT_DEBUG को परिभाषित/अपरिभाषित करते समय, आपके द्वारा प्रदान किए गए संस्करण की तुलना में संकलन और लिंक समय बहुत कम हो गया है। – Dodo

0

errm, क्यों अलग ढंग से पूर्व प्रोसेसर मैक्रो का उपयोग नहीं?

बस मेरे सिर के ऊपर से, की तरह कुछ:

#define DEBUG_TRACE(p) 
    #ifdef PRINT_DEBUG 
    printDebug(p); 
    #else 
    ; 
    #endif 
+0

यह उपयोग की तुलना में अलग नहीं है, केवल अलग लिखा है। – Dodo

0

वर्तमान में अनुकूलन के सबसे संकलन समय पर किया जाता है। LLVM के रूप में कुछ कंपाइलर लिंक समय पर अनुकूलित करने में सक्षम हैं। यह वास्तव में एक दिलचस्प विचार है। मैं आपको एक नज़र डालने का सुझाव देता हूं।

इस तरह के अनुकूलन की प्रतीक्षा कर रहे हैं, आप क्या कर सकते हैं निम्नलिखित है। एक मैक्रो को परिभाषित करें जो आपको निम्नलिखित बयान शामिल करने देता है कि DEBUG परिभाषित किया गया है या नहीं।

#ifdef DEBUG 
#define IF_DEBUG (false) {} else 
#else 
#define IF_DEBUG 
#endif 

आप कर सकते हैं यह इस

Basic() { 
     simpleSetupCode; 

     // this should be a NOOP in release, 
     // but constructor could be inlined 
     IF_DEBUG printDebug(this); 
    } 

जो पहले से ही बहुत से

Basic() { 
     simpleSetupCode; 

     // this should be a NOOP in release, 
     // but constructor could be inlined 
#if DEBUG 
     printDebug(this); 
#endif 
    } 

नोट अधिक पठनीय है कि आप इसे उपयोग कर सकते हैं जैसे कि यह एक कीवर्ड

था जैसे उपयोग
IF_DEBUG { 
    printDebug(this); 
    printDebug(thas); 
} 
1
#if PRINT_DEBUG 
#define printDebug _real_print_debug 
#else 
#define printDebug(...) 
#endif 

इस तरह प्रीप्रोसेसर संकलक को यहां तक ​​पहुंचने से पहले सभी डीबग कोड को पट्टी कर देगा।

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