2009-11-06 15 views
10

मैं निम्नलिखित सी कोड के बारे में एक प्रश्न है:स्थानीय चर के लिए आवंटित स्टैक स्पेस कब होता है?

void my_function() 
{ 
    int i1; 
    int j1; 

    // Do something... 

    if (check_something()) 
    { 
     int i2; 
     int j2; 

     // Do something else... 
    } 

    // Do some more stuff... 
} 

वहाँ जब ढेर अंतरिक्ष आवंटित किया जाता है/i2 के लिए पुनः आवंटित की जाती है और J2 या यह संकलक पर निर्भर करता है के बारे में कोई गारंटी देता है? मैं उम्मीद करता हूं कि स्टैक पॉइंटर को समायोजित किया जाएगा जब i2 और j2 गुंजाइश में आते हैं और जब वे दायरे से बाहर निकलते हैं तो बैक अप समायोजित होते हैं, लेकिन फिर सोचा जाता है कि कुछ कंपाइलर्स पूरी चीज को "ऑप्टिमाइज़" कर सकते हैं और नेस्टेड स्कोप में चर के लिए खाता कर सकते हैं समारोह पहले दर्ज किया गया है।

मुझे पता है कि मैं अपने कंपाइलर द्वारा उत्पन्न असेंबली कोड देख सकता हूं, लेकिन यह सोच रहा था कि कार्यान्वयन को कंपाइलर तक छोड़ा जा सकता है या नहीं।

धन्यवाद!

+5

यह भी मान लें कि चर के लिए चर आवंटित किए जा सकते हैं ... – unwind

उत्तर

6

संकलक जो कुछ भी चाहता है उसे करने के लिए स्वतंत्र है, जब तक भाषा केआरक्षित हैं। दूसरे शब्दों में, i2 और j2 निष्पादन उनके ब्लॉक के प्रवेश बिंदु तक पहुंचने से पहले मेमोरी स्थानों तक बाध्य किया जा सकता है, और जब तक यह आपके कोड के अर्थशास्त्र को प्रभावित नहीं करता है तब तक किसी भी समय असंबद्ध हो सकता है।

8

कोई गारंटी नहीं है।

विभिन्न अनुकूलन झंडे परिणामस्वरूप चर को बचाने के विभिन्न तरीकों के परिणामस्वरूप होंगे।

कंपाइलर 1 या अधिक वैरिएबल भी स्टैक का उपयोग नहीं कर सकता है और उन्हें फ़ंक्शन निष्पादन की पूरी अवधि के लिए रजिस्टरों में रख सकता है।

+0

+! कोई गारंटी के लिए। –

4

जैसा कि मैं समझता हूं कि आपको यह भी गारंटी नहीं मिल सकती है कि ये चर ढेर पर आवंटित किए गए हैं, उन्हें रजिस्टरों में संग्रहीत किया जा सकता है।

तुम सच में यहाँ प्रभावित हो सकता है क्या: रजिस्टर कीवर्ड का उपयोग करके रजिस्टर करने के लिए चर जगह

  • सलाह संकलक।

 
    int f(void) 
    { 
     /* var1 and var2 probably use the same place for storage. */ 
     { 
      int var1; 
      /* ... do something */ 
     } 

     { 
      int var2; 
      /* ... do something */ 
     } 
    } 


  • भी दिया परिभाषित गुंजाइश देरी प्रारंभ:
के रूप में आप कर सकते हैं के रूप में देर से जगह पर घोषणा ले जाकर चर गुंजाइश स्थानीयकृत साथ

  • सहायता संकलक

     
    { 
        int i; /* Yes, you must declare it at the begin of block. 
    
        /* Do something... */ 
    
        i = START_VALUE; 
        /* But you need it only here and below... */ 
    } 
    
  • 0

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

    3

    यदि चर को ढेर पर रखा जा रहा है, तो फ़ंक्शन में पहले कथन से पहले कार्य की शुरुआत में स्टैक स्पेस आवंटित किया जाता है।सभी स्थानीय चरों को स्टोर करने के लिए स्टैक पॉइंटर को बाइट्स की कुल संख्या (या नीचे) ले जाया जाएगा।

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