2010-07-14 11 views
9

कचरा मूल्य कहाँ संग्रहीत किया जाता है, और किस उद्देश्य के लिए?सी मानक अनिश्चित चर के उपयोग को क्यों छोड़ देता है?

+5

कचरा मूल्य "संग्रहीत" नहीं होते हैं और कोई "उद्देश्य" नहीं देते हैं। वे एक अनियमित वैरिएबल द्वारा कब्जा कर लिया गया स्मृति स्थान में जो कुछ भी होता है वह बस होता है। – Cogwheel

+2

बहुत तेज तेज़। यह एक प्रश्न है। यह बेहतर समझाया जा सकता है (कर सकता/चाहिए)। लेकिन यह एक सवाल है। शायद एक डुप्लिकेट, लेकिन यह एक सवाल है। मेरा चल रहा जवाब था: >> – ShinTakezou

+1

कचरा मूल्य जानबूझकर संग्रहीत नहीं किया जाता है। बस, स्मृति और रजिस्ट्रार मान रखते हैं। यदि कोई भी उन्हें जो भी दिलचस्पी लेता है (किसी फ़ंक्शन के कॉलर की तरह) के लिए अर्थपूर्ण कुछ भी सेट करता है, तो ऐसा होता है कि "कॉलर" को "कचरा" मान मिलता है, यानी स्मृति के क्षेत्र या किसी रजिस्टर को एक्सेस किया जाता है जिसे कोई भी सेट नहीं करता है सार्थक मूल्य, तो यह हो सकता है कि जो भी पहले उस स्मृति के स्वामित्व में है, या अंतिम गणना, या किसी अन्य "अप्रत्याशित" तथ्य के अनुसार हो सकता है। यदि आपका मतलब कुछ अलग है, तो अपना प्रश्न बेहतर निर्दिष्ट करें। – ShinTakezou

उत्तर

10

सी दक्षता कारणों के लिए कुछ स्वचालित मानों को चर शुरू करने का विकल्प चुनता है। इस डेटा को आरंभ करने के लिए, निर्देशों को जोड़ा जाना चाहिए।

int main(int argc, const char *argv[]) 
{ 
    int x; 
    return x; 
} 

उत्पन्न करता है:

pushl %ebp 
movl %esp, %ebp 
subl $16, %esp 
movl -4(%ebp), %eax 
leave 
ret 

इस कोड को एक ओर जहां:

int main(int argc, const char *argv[]) 
{ 
    int x=1; 
    return x; 
} 

उत्पन्न करता है: यहाँ एक उदाहरण है

pushl %ebp 
movl %esp, %ebp 
subl $16, %esp 
movl $1, -4(%ebp) 
movl -4(%ebp), %eax 
leave 
ret 

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

+4

आपका पहला स्निपेट बहुत अच्छा यादृच्छिक संख्या जनरेटर नहीं है। –

+0

मुझे यकीन नहीं है कि इसका क्या अर्थ है: "इससे कोई फर्क पड़ता है, और अभी भी एम्बेडेड सिस्टम पर करता है"। –

+2

@ माइकल बुर: मैंने इसे "जब तक आप एक एम्बेडेड सिस्टम पर काम नहीं कर रहे हैं, तब तक व्याख्या की है, आपको अतिरिक्त निर्देश के प्रदर्शन प्रभाव के बारे में चिंता नहीं करनी चाहिए।" – Cogwheel

5

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

+0

यह भाषा में हर जगह दिखाई देता है, उदा। अंकगणितीय प्रकार आदि का अपरिभाषित आकार –

2

सी अपेक्षाकृत निम्न स्तर की भाषा होने के लिए डिज़ाइन किया गया था ताकि इसका उपयोग ऑपरेटिंग सिस्टम जैसे लेखन, अच्छी तरह से निम्न स्तर की सामग्री के लिए किया जा सके। (वास्तव में, यह डिज़ाइन किया गया था ताकि यूनिक्स सी में लिखा जा सके) आप इसे पठनीय वाक्यविन्यास और उच्च स्तरीय संरचनाओं के साथ असेंबली कोड के रूप में सोच सकते हैं। इस कारण से, सी (माइनस ऑप्टिमाइज़ेशन) ठीक वही करता है जो आप इसे करने के लिए कहते हैं, कुछ भी नहीं, कुछ भी कम नहीं।

जब आप int x; लिखते हैं, तो संकलक बस पूर्णांक के लिए स्मृति आवंटित करता है। आपने कभी भी वहां कुछ भी स्टोर करने के लिए नहीं कहा था, इसलिए जब भी आपका प्रोग्राम शुरू होता है तब उस स्थान पर जो भी था। अक्सर, यह पता चला है कि पूर्व-मौजूदा मूल्य "कचरा" है।

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

+0

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

5

कचरा मूल्य वास्तव में कहीं भी संग्रहीत नहीं होते हैं। वास्तव में, कचरा मूल्य वास्तव में मौजूद नहीं है, जहां तक ​​अमूर्त भाषा का संबंध है।

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

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

2

सी मानक अनिश्चित चर का उपयोग क्यों अनिश्चित है?

यह नहीं करता है: (Why) is using an uninitialized variable undefined behavior?

  • वैश्विक के लिए:

    • स्थानीय चर के लिए

      , यह अनिर्धारित व्यवहार, जिसका अर्थ है कुछ भी (जैसे segfault, अपनी हार्ड डिस्क को मिटाकर) कानूनी है कि कहते हैं चर, यह शून्य है: What happens to a declared, uninitialized variable in C? Does it have a value?

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