2010-05-24 15 views
5

स्थिरांक को परिभाषित करने के लिए, अधिक आम और सही तरीका क्या है? #define के साथ स्थिरांक परिभाषित करने के संकलन, लिंकिंग इत्यादि के मामले में लागत क्या है? यह एक और तरीका महंगा है?#define की लागत क्या है?

+0

कोई भाषा, कोई भाषा चुनें? –

+1

@ केली: टैग देखें। – Cam

+1

सी # स्थिरांक को परिभाषित करने के लिए '# परिभाषित' का उपयोग करने की अनुमति नहीं देता है। आप 'DEBUG परिभाषित कर सकते हैं, लेकिन' DEBUG 1' परिभाषित नहीं करें। http://msdn.microsoft.com/en-us/library/yt3yck0x.aspx –

उत्तर

14

किसी भी स्थिरांक परिभाषित करने के लिए सबसे अच्छा तरीका है लिखने के लिए

const int m = 7; 
const float pi = 3.1415926f; 
const char x = 'F'; 

#define का उपयोग करते हुए एक बुरा C++ शैली है। नामस्थान स्कोप में #define छिपाना असंभव है।

#define pi 3.1415926 

तुलना करें

namespace myscope { 
const float pi = 3.1415926f; 
} 

दूसरा रास्ता साथ स्पष्ट रूप से बेहतर है।

+2

+1 '# परिभाषित' भी खराब शैली है क्योंकि यह कंपाइलर को कोई स्पष्ट प्रकार की जानकारी नहीं देता है। – GrahamS

+2

यह सटीक रूप से स्टाइलिस्ट सिफारिशों को बताता है लेकिन सवाल का जवाब नहीं देता है। उचित सी ++ शैली में घोषित स्थिरांकों की लागत है कि # डिफाइन नहीं है। –

+1

@ डैन ओल्सन: आह लेकिन # डिफाइनों के पास कोड आकार के मामले में भी लागत है, क्योंकि (कंपाइलर स्मारकों के आधार पर) आप कई अक्षरों को शुरू कर सकते हैं जहां एक एकल कॉन्स होता। @Espuz: न तो लागत चिंता करने लायक है (जब तक कि आप बहुत कम स्तर की माइक्रोप्रोसेसर सामग्री नहीं कर रहे हों) तो बेहतर शैली के साथ जाएं, जहां संभव हो वहां 'कॉन्स्ट' है। – GrahamS

2

लागत केवल प्रीप्रोसेसर के लिए है, जब # परिभाषाएं हल हो जाती हैं (निश्चित रूप से स्थिरता के लिए # परिभाषाओं से भरे एक परियोजना से निपटने की अतिरिक्त डीबगिंग लागत को अनदेखा कर रही हैं)।

0

#define स्ट्रिंग प्रतिस्थापन है। तो यदि आप मैक्रोज़ में गलतियां करते हैं, तो वे बाद में त्रुटियों के रूप में दिखाई देंगे। अधिकतर गलत प्रकार या गलत अभिव्यक्ति आम हैं।

सशर्त संकलन के लिए, प्री-प्रोसेसर मैक्रोज़ सबसे अच्छा काम करते हैं। गणना के लिए उपयोग किए जाने वाले अन्य स्थिरांक के लिए, const अच्छा काम करता है।

1

#define मैक्रोज़ प्री-प्रोसेसर द्वारा संसाधित होते हैं, वे संकलक के लिए दृश्यमान नहीं होते हैं। और चूंकि वे एक प्रतीक के रूप में कंपाइलर के लिए दृश्यमान नहीं हैं, इसलिए किसी मैक्रो को शामिल करने में कुछ डीबग करना मुश्किल है।

स्थिरांक को परिभाषित करने का पसंदीदा तरीका उचित प्रकार की जानकारी के साथ कॉन्स कीवर्ड का उपयोग कर रहा है।

const unsigned int ArraySize = 100; 

और भी बेहतर

static const unsigned int ArraySize = 100; 

जब लगातार केवल एक ही फाइल में प्रयोग किया जाता है।

1

#define संकलन समय में वृद्धि होगी, लेकिन यह तेजी से निष्पादन में होगा ...

सशर्त संकलन #define में

आम तौर पर प्रयोग किया जाता है ...

जहां स्थिरांक संख्या के सामान्य गणना में प्रयोग किया जाता है

विकल्प आपकी आवश्यकता पर निर्भर करता है ...

+1

सबसे अच्छा #define का उपयोग करके गति वृद्धि मामूली होगी। यदि संकलक कॉन्स को अनुकूलित करता है तो इसका कोई फायदा नहीं होगा और आप कॉन्स के लाभों को खो देते हैं। – JeremyP

+0

हाँ ... #define सशर्त संकलन में आसान है (क्रॉस प्लेटफॉर्म एप्लिकेशन में ...) यह एकमात्र लाभ है जिसे माना जा सकता है ... –

5

कंपाइलर स्वयं को #define कभी नहीं देखता है। प्रीप्रोसेसर कंपाइलर को पारित होने से पहले सभी मैक्रोज़ फैलाता है। साइड इफेक्ट्स में से एक यह है कि मान दोहराए जाते हैं ... और दो समान स्ट्रिंग्स एक ही स्ट्रिंग की जरूरी नहीं हैं। यदि आप

#define SOME_STRING "Just an example" 

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

0

CPU समय वास्तव में #define या macros का उपयोग करने की लागत नहीं है। एक डेवलपर के रूप "लागत" इस प्रकार है:

  • यदि आपके मैक्रो में कोई त्रुटि है, संकलक यह है जहाँ आप मैक्रो संदर्भित, नहीं, जहां आप इसे परिभाषित झंडा होगा।
  • आप अपने मैक्रो के लिए टाइप सुरक्षा और स्कोपिंग खो देंगे।
  • डीबगिंग उपकरण मैक्रो के मूल्य को नहीं जान पाएंगे।

ये चीजें CPU चक्रों को जला नहीं सकती हैं, लेकिन वे डेवलपर चक्र जला सकते हैं।

स्थिरांक के लिए, const चर घोषित करना बेहतर है, और छोटे प्रकार के स्वतंत्र कार्यों के लिए, इनलाइन फ़ंक्शंस और टेम्पलेट बेहतर हैं।

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