2010-08-09 5 views
8

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

int x; 
cout << x; 

इस कोर्स के अप्रत्याशित (अच्छी तरह से, जब तक आप पता था कि कैसे अपने कार्यक्रम स्मृति मानचित्रण गया था) परिणाम वापस होगा, लेकिन मेरे सवाल:

उदाहरण के लिए, सी ++ में, आप एक टुकड़ा इस तरह के रूप में लिख सकते हैं है, यह व्यवहार कंपेलरों द्वारा क्यों अनुमति दी जाती है?

क्या कोई एप्लिकेशन या दक्षता है जो अनियमित स्मृति के उपयोग की अनुमति देने से होती है?

संपादित करें: यह मेरे लिए हुआ कि उपयोगकर्ता को प्रारंभिक छोड़ने से स्मृति माध्यमों के लिए लिखना कम हो जाएगा जिनमें सीमित जीवनकाल (लिखने-चक्र) हैं। 'प्रदर्शन' के उपरोक्त शीर्षक के तहत बस एक विशिष्ट उदाहरण। धन्यवाद।

उत्तर

1

शायद कुछ मामलों में, स्मृति की शुरुआत होने तक स्मृति को अनइंस्टॉलिज्ड छोड़ना तेज़ है (उदाहरण के लिए, यदि आप चर का उपयोग करने से पहले किसी फ़ंक्शन से वापस आते हैं)। मैं आम तौर पर सबकुछ शुरू करता हूं, मुझे संदेह है कि यह प्रदर्शन में कोई वास्तविक भिन्न बनाता है। कंपाइलर के पास बेकार प्रारंभिकताओं को अनुकूलित करने का अपना तरीका होगा, मुझे यकीन है।

4

प्रोग्रामिंग में सबसे पुराना बहाना: यह प्रदर्शन में सुधार करता है!

संपादित करें: अपनी टिप्पणियां पढ़ें और मैं सहमत हूं - साल पहले प्रदर्शन पर ध्यान CPU चक्रों की संख्या पर था। मेरा पहला सी कंपाइलर पारंपरिक सी था (एएनएसआई सी से पहले) और यह संकलन के सभी प्रकार के घृणित होने की इजाजत देता था। इन आधुनिक समय में प्रदर्शन ग्राहक शिकायतों की संख्या के बारे में है। जैसा कि मैंने नए स्नातकों को बताया है कि हम किराए पर लेते हैं - 'मुझे परवाह नहीं है कि प्रोग्राम कितनी जल्दी गलत जवाब देता है'। आधुनिक कंपाइलर्स और विकास के सभी उपकरणों का उपयोग करें, कम बग लिखें और हर समय घर जा सकता है।

+2

क्या यह प्रदर्शन को और भी घोषित नहीं कर सकता है? इस तरह, स्मृति को चर के लिए भी आवंटित करने की आवश्यकता नहीं होगी। कोई भी जो इस प्रकार के कोड के लिए प्रदर्शन उद्धृत करता है वह सिर्फ सादा गलत है। –

+1

कुंजी शब्द * सबसे पुराना * है। 40 साल पहले जब सी विकसित किया जा रहा था, एक वैरिएबल को स्वचालित रूप से शुरू करने के लिए एक निर्देश या दो "बर्बाद" हो सकता था। – dan04

+0

एक निर्देश को बर्बाद करना मूल्यवान हो सकता है, लेकिन प्रदर्शन की भावना में, उस अतिरिक्त निर्देश (या दो या तीन) होने से एप्लिकेशन कम प्रदर्शन करेगा। –

1

कुछ भाषाओं में कुछ चर प्रकारों के लिए डिफ़ॉल्ट मान हैं। ऐसा कहा जा रहा है कि मुझे संदेह है कि किसी भी भाषा में उन्हें स्पष्ट रूप से प्रारंभ करने के लिए प्रदर्शन लाभ नहीं हैं। हालांकि कमियां हैं:

  • संभावना है कि यह प्रारंभ किया जा रहा है और आप एक दुर्घटना
  • अप्रत्याशित मूल्यों का जोखिम के बिना किया जाना चाहिए
  • स्पष्टता और अन्य प्रोग्रामर

मेरे सुझाव के लिए उद्देश्य की कमी हमेशा आपके चर को प्रारंभ करता है और स्थिरता स्वयं के लिए भुगतान करेगी।

4

कुछ एपीआई में पारित चर के माध्यम से डेटा वापस जाने के लिए तैयार कर रहे हैं, उदाहरण के लिए:

bool ok; 
int x = convert_to_int(some_string, &ok); 

यह समारोह के अंदर 'ठीक है' का मान सेट कर सकते हैं ताकि आरंभ यह बर्बादी है।

(मैं एपीआई की इस शैली की वकालत कर रहा हूँ नहीं।)

+1

इसके "असली दुनिया" उपयोग के लिए, क्यूटी के क्यूस्ट्रिंग क्लास देखें: http://doc.qt.nokia.com/4.6/qstring.html#toInt उदाहरण के रूप में। बूल नोटिस * ठीक है। – sivabudh

+0

यह फ़ंक्शन पैरामीटर पर निर्भर करता है कि क्या वे आउट-टाइप किए गए हैं, या इन-टाइप किए गए हैं। – YeenFei

+1

एसडीडी इनपुट धाराओं के साथ ही: 'बूल ठीक है; std :: cin >> ठीक है; ' – rafak

13

मेरे विचार (और मैं गलत से पहले किया गया है, बस मेरी पत्नी से पूछना) कि यह बस भाषा का प्रारम्भिक अवतार से एक पकड़ मिली है कर रहे हैं ।

सी के शुरुआती संस्करणों ने आपको किसी भी समारोह में कहीं भी वेरिएबल्स घोषित करने की अनुमति नहीं दी, उन्हें शीर्ष पर होना था (या शायद ब्लॉक की शुरुआत में, मेरे सिर के शीर्ष को याद रखना मुश्किल है मैं आजकल शायद ही कभी ऐसा करता हूं)।

इसके अतिरिक्त, आपको केवल एक चर सेट करने की समझने योग्य इच्छा है जब आप जानते हैं कि यह क्या होना चाहिए। एक वैरिएबल को कुछ शुरू करने में कोई बात नहीं है यदि अगली चीज़ जो आप इसके साथ करने जा रहे हैं, वह उस मूल्य को ओवरराइट कर लेती है (यही वह जगह है जहां प्रदर्शन लोग यहां से आ रहे हैं)। लेकिन तब भी आप चाहिए नहीं उपयोग उन्हें इससे पहले कि आप उन्हें आरंभ

इसलिए यह के लिए आवश्यक है uninitialised चर अनुमति देते हैं, और अच्छे compilers चेतावनी जाने के लिए आप इसके बारे में पता है।

सी ++ (और बाद में सी के अवतार) जहां आप किसी फ़ंक्शन में कहीं भी अपना चर बना सकते हैं, तो आपको वास्तव में इसे बनाना चाहिए और इसे एक ही समय में प्रारंभ करना चाहिए। लेकिन यह जल्दी संभव नहीं था। आप की तरह कुछ का उपयोग करने के लिए किया था: आजकल

int fn(void) { 
    int x, y; 
    /* Do some stuff to set y */ 
    x = y + 2; 
    /* Do some more stuff */ 
} 

, मैं ऑप्ट-इन करेंगे के लिए:

int fn(void) { 
    int y; 
    /* Do some stuff to set y */ 
    int x = y + 2; 
    /* Do some more stuff */ 
} 
+0

+1 कई वर्षों से सी/सी ++ होने से आ रहा है। इस लाइन के साथ भी एक जवाब टाइप कर रहा था, आपने मुझे इसे हराया :) एक वैरिएबल शुरू करना बुद्धिमान मूल्य के साथ अपने मुख्य कोड तर्क के करीब है जो इसे यथासंभव उपयोग करता है - दूरी मीट्रिक। –

+0

@ozmo, यह स्वीकार्य उत्तर होना चाहिए। आधुनिक कंपेलरों के लिए – sivabudh

+1

+1 आपको चेतावनी देगा। बस उच्चतम स्तर पर चेतावनी स्तर को चिपकाएं और फिर सभी चेतावनियों की त्रुटियां करें और आपके पास समान प्रभाव पड़ता है क्योंकि लोगों को उपयोग से पहले प्रारंभ करने के लिए मजबूर करना पड़ता है। सिर्फ इसलिए कि इंसान आलसी डू का मतलब यह नहीं है कि हम स्मार्ट कंपाइलर्स के साथ क्षतिपूर्ति नहीं कर सकते :-) लंबे समय तक लाइव या कंपाइलर ओवरलैर्ड। –

2

संक्षिप्त उत्तर है कि और अधिक जटिल मामलों के लिए, संकलक एक चर है कि क्या निर्धारित करने में सक्षम नहीं हो सकता है प्रारंभिकरण से पहले या नहीं किया जाता है।

उदाहरण के लिए। अगर वे एक संभावित उपयोग पहले प्रारंभ त्रुटि देखा जा सकता है

int x; 
if (external_function() == 2) { 
    x = 42; 
} else if (another_function() == 3) { 
    x = 49; 
} 
yet_another_function(&x); 
cout << x; // Is this a use-before-definition? 

अच्छा compilers एक चेतावनी संदेश दे देंगे, लेकिन जटिल मामलों के लिए - विशेष रूप से कई संकलन इकाइयों को शामिल - संकलक बताने के लिए कोई रास्ता नहीं है।

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

0

चर के आकार के आधार पर, प्रदर्शन के नाम पर अनियमित मूल्य को छोड़कर माइक्रो-ऑप्टिमाइज़ेशन के रूप में माना जा सकता है। अपेक्षाकृत कुछ कार्यक्रम (जब वहां सॉफ़्टवेयर प्रकारों की विस्तृत श्रृंखला की तुलना की जाती है) को डबल लोड करने के लिए आवश्यक अतिरिक्त दो-तीन-तीन चक्रों से नकारात्मक रूप से प्रभावित किया जाएगा; हालांकि, वैरिएबल का मानना ​​काफी बड़ा था, प्रारंभिक रूप से देरी होने तक देरी से प्रारंभिक स्पष्ट होने की आवश्यकता है, शायद यह एक अच्छा विचार है।

0
पाश शैली

int i; 
for(i=0;i<something;++i){ 
    ....... 
} 
do something with i 

के लिए

और आप for(init;condition;inc)

यहाँ एक परम आवश्यकता के साथ एक है की तरह लग रहे करने के लिए पाश के लिए पसंद करेंगे

bool b; 
do{ 
    .... 
    b = g(); 
    .... 
}while(!b); 

क्षैतिज स्क्रीन लंबे नेस्टेड नाम के साथ अचल संपत्ति

डीबगिन के लिए लंबे समय तक स्कॉइंग जी दृश्यता

बहुत बार प्रदर्शन