2012-01-04 16 views
16

यदि मैं लूप के अंदर एक चर घोषित करना था, तो क्या यह लूप के बाहर घोषणा करना तेज़ है? क्या कार्यक्रम प्रत्येक पुनरावृत्ति पर n के लिए स्मृति को पुन: आवंटित करता है या पूरे स्मृति स्थान का उपयोग करता है?वैरिएबल एक लूप के अंदर घोषित

for(int i=0;i<10;i++) 
{ 
    int n = getNumber(); 
    printf("%d\n",n); 
} 

बनाम

int n; 
for(int i=0;i<10;i++) 
{ 
    n = getNumber(); 
    printf("%d\n",n); 
} 

उत्तर

12

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

ध्यान दें कि, सी ++, सी, जो निर्माताओं के लिए एक धारणा नहीं है के विपरीत,, वस्तु निर्माण और विनाश का समर्थन करता है, इसलिए यदि आप एक वर्ग प्रकार का एक चर निम्नलिखित की तरह, पाश के लिए एक में परिभाषित करने के लिए थे

class MyClass { 
    public: MyClass() { cout << "hello world" << endl; } 
}; 
//... 
for (int i = 0; i < 10; ++i) { 
    MyClass m; 
} 

आप हर बार अपने निर्माता को कॉल करते हैं, प्रभावी रूप से "हैलो वर्ल्ड" को दस बार प्रिंट करते हैं। यह सी घोषणाओं से बहुत अलग है और इसके साथ भ्रमित नहीं होना चाहिए।

+0

धन्यवाद, मेरा मतलब है कि प्रत्येक पुनरावृत्ति पर स्मृति को फिर से आवंटित किया गया है। मैंने सवाल बदल दिया है। –

14

कोई भी आधुनिक कंपाइलर इन्हें उसी मशीन कोड पर अनुकूलित करेगा, इसलिए आपको कोई अंतर नहीं दिखना चाहिए।

+2

लूप में परिभाषित स्पष्ट है और अधिक अनुकूलित कोड उत्पन्न कर सकता है क्योंकि संकलक जीवनकाल जानता है (हालांकि शायद एक साधारण प्रकार के लिए नहीं) –

1

अधिकांश आधुनिक कंपाइलरों के लिए, इससे कोई फर्क नहीं पड़ता। वे प्रोसेसर रजिस्टरों को आवंटित करेंगे या स्टैक पर वैरिएबल को यथासंभव कुशलता से रखें।

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