2013-05-20 3 views
11

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

अन्यथा, अगर मैं उस चर के पते के लिए पूछता हूं (रजिस्टर के रूप में संग्रहीत) क्या होता है तो क्या होगा? मुझे पता है कि हम चर के पते को स्पष्ट रूप से पंजीकृत करने के लिए सेट नहीं कर सकते हैं (register int c)।

संपादित:

उदाहरण के लिए, अगर मैं ऐसा कर सकता है

int c = 1; 
print("Address of c: %p", &c); 

की तरह कुछ तो इस चर एक रजिस्टर में संग्रहीत नहीं किया जा सका करते हैं,? संकलक स्वचालित रूप से इसे स्मृति में संग्रहीत के रूप में सेट करेगा? अन्यथा (यदि यह सिर्फ एक रजिस्टर में संग्रहीत है), स्क्रीन में पता क्या पता होगा?

+0

यह मेरे लिए अस्पष्ट है कि आप क्या पूछ रहे हैं। यदि आप फ़ंक्शन तर्कों के बारे में बात कर रहे हैं, तो वे सभी ढेर के माध्यम से संभाले जाते हैं। – alex

+3

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

+0

मेरा मतलब है कि एक सामान्य अर्थ में चर के पते का उपयोग करना। उदाहरण के लिए, मैं सिर्फ स्क्रीन पर पता मुद्रित कर सकता था। –

उत्तर

19

सबसे पहले, सी मानक register घोषित एक चर के पते को लेने पर रोक लगाता है, जैसा कि यह struct एस में बिट फ़ील्ड के लिए करता है।

गैर-रजिस्टर ("ऑटो") चर के लिए, संक्षिप्त उत्तर हाँ है। एक अनुकूलक की सबसे सरल रणनीति उन चरों को तुरंत फैलाना है जिनके पते ले लिए गए हैं।

"स्पिल" पंजीकरण आवंटन के साहित्य से सिर्फ एक शब्द है जिसका अर्थ है "रजिस्टर के बजाय स्मृति में स्थानांतरित करने का निर्णय लें।"

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

एक और प्रासंगिक अनुकूलन लाइव रेंज विभाजन है। यह एक चर को निर्देशों की श्रेणी के हिस्से के लिए एक रजिस्टर में संग्रहीत करने की अनुमति देता है जहां यह एक उपयोगी मूल्य (इसकी "लाइव रेंज") रखता है और अन्य भागों में फैलता है। इस मामले में स्पिल्ड पार्ट्स उन स्थानों के अनुरूप होंगे जहां पॉइंटर का उपयोग वैरिएबल के मान को बदलने के लिए किया जा सकता है। उदाहरण के लिए:

x = 3; 
... lots of computations involving x 
if T { 
    // SPILL HERE, so store register holding x to memory 
    int *p = &x; 
    ... lots of computations, perhaps using p to change x 
    *p = 2; 
    // DONE SPILL HERE, so reload register 
    ... more code here not using p to change x. 
} 
else { 
    ... lots of computations involving x. 
} 

इस कोड को एक्स के लिए एक ढेर स्थिति आवंटित सकता है, लेकिन कोड के शीर्ष पर एक रजिस्टर में इसे लोड, को छोड़कर के लिए इस क्षेत्र में एक फैल के रूप में चिह्नित वहाँ इसे बनाए रखने की एक आक्रामक अनुकूलक। यह क्षेत्र रजिस्टर की दुकान से स्मृति और मिलान करने वाले रजिस्टर लोड से घिरा होगा।

+0

क्षमा करें, मुझे वास्तव में पहले अनुच्छेद में पहली दूसरी वाक्य नहीं मिली। ऑप्टिमाइज़र (कंपाइलर) उन चर को फैलता है? –

+1

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

3

अपना पता ले कर, आप संकलक को चर में डालकर मजबूर करने के लिए मजबूर करते हैं और इसे किसी रजिस्टर में अनुकूलित नहीं करते हैं। Address of register variable

+4

यह सही नहीं है। मैंने 'int foo (int x) {int y = x, * z = & y संकलित किया; वापसी * ​​जेड * * जेड; } ''सीसी-ओ 3-एसडीडी = सी 99-एस' का उपयोग करके ऐप्पल क्लैंग संस्करण 4.0 के साथ और जेनरेट किए गए असेंबली कोड की जांच की। किसी भी बिंदु पर यह स्मृति में 'x' या' y' नहीं लगा। कंपाइलर को केवल मान को स्मृति में रखने के लिए मजबूर किया जाता है यदि यह निर्धारित करने में असमर्थ है कि आवश्यक "अवलोकन योग्य" व्यवहार अन्यथा प्रदान नहीं किया जा सकता है। –

0

संकलक, अनुकूलन के संकेत के साथ बहुत सावधान रहना होगा क्योंकि किसी को भी उन्हें पर्दे के पीछे बदल सकते हैं:

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

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