कचरा मूल्य कहाँ संग्रहीत किया जाता है, और किस उद्देश्य के लिए?सी मानक अनिश्चित चर के उपयोग को क्यों छोड़ देता है?
उत्तर
सी दक्षता कारणों के लिए कुछ स्वचालित मानों को चर शुरू करने का विकल्प चुनता है। इस डेटा को आरंभ करने के लिए, निर्देशों को जोड़ा जाना चाहिए।
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 स्थानांतरित करने के लिए प्रयोग किया जाता है। इससे कोई फर्क पड़ता है, और अभी भी एम्बेडेड सिस्टम पर करता है।
आपका पहला स्निपेट बहुत अच्छा यादृच्छिक संख्या जनरेटर नहीं है। –
मुझे यकीन नहीं है कि इसका क्या अर्थ है: "इससे कोई फर्क पड़ता है, और अभी भी एम्बेडेड सिस्टम पर करता है"। –
@ माइकल बुर: मैंने इसे "जब तक आप एक एम्बेडेड सिस्टम पर काम नहीं कर रहे हैं, तब तक व्याख्या की है, आपको अतिरिक्त निर्देश के प्रदर्शन प्रभाव के बारे में चिंता नहीं करनी चाहिए।" – Cogwheel
आईआईआरसी, थॉम्पसन या रिची ने कुछ साल पहले एक साक्षात्कार किया था, जहां उन्होंने कहा था कि भाषा परिभाषा जानबूझकर कुछ जगहों पर अस्पष्ट चीजों को छोड़ देती है, इसलिए विशिष्ट प्लेटफार्मों पर कार्यान्वयन करने वालों को समझने के लिए कुछ करना था (चक्र, स्मृति, आदि) उस मंच पर। क्षमा करें मेरे पास लिंक करने का कोई संदर्भ नहीं है।
यह भाषा में हर जगह दिखाई देता है, उदा। अंकगणितीय प्रकार आदि का अपरिभाषित आकार –
सी अपेक्षाकृत निम्न स्तर की भाषा होने के लिए डिज़ाइन किया गया था ताकि इसका उपयोग ऑपरेटिंग सिस्टम जैसे लेखन, अच्छी तरह से निम्न स्तर की सामग्री के लिए किया जा सके। (वास्तव में, यह डिज़ाइन किया गया था ताकि यूनिक्स सी में लिखा जा सके) आप इसे पठनीय वाक्यविन्यास और उच्च स्तरीय संरचनाओं के साथ असेंबली कोड के रूप में सोच सकते हैं। इस कारण से, सी (माइनस ऑप्टिमाइज़ेशन) ठीक वही करता है जो आप इसे करने के लिए कहते हैं, कुछ भी नहीं, कुछ भी कम नहीं।
जब आप int x;
लिखते हैं, तो संकलक बस पूर्णांक के लिए स्मृति आवंटित करता है। आपने कभी भी वहां कुछ भी स्टोर करने के लिए नहीं कहा था, इसलिए जब भी आपका प्रोग्राम शुरू होता है तब उस स्थान पर जो भी था। अक्सर, यह पता चला है कि पूर्व-मौजूदा मूल्य "कचरा" है।
कभी-कभी, एक बाहरी प्रोग्राम (उदाहरण के लिए एक डिवाइस चालक) आपके कुछ चरों में लिख सकता है, इसलिए ऐसे चर को प्रारंभ करने के लिए एक और निर्देश जोड़ने के लिए अनावश्यक है।
एक स्वैप फ़ंक्शन एक अच्छा उदाहरण है जहां temp चर प्रारंभ करना पूरी तरह से व्यर्थ होगा (और समग्र फ़ंक्शन रनटाइम के लिए महंगा सापेक्ष)। अधिकतर कार्य लंबे समय तक होंगे ताकि स्वचालित प्रारंभिकता की रनटाइम लागत अपेक्षाकृत छोटी हो लेकिन फिर, जैसा कि @ निंजल ने इंगित किया, वहां बड़े डेटा वाले मामले हैं जहां यह वास्तव में चोट पहुंचाएगा यदि आप इसे बंद नहीं कर सकते हैं। –
कचरा मूल्य वास्तव में कहीं भी संग्रहीत नहीं होते हैं। वास्तव में, कचरा मूल्य वास्तव में मौजूद नहीं है, जहां तक अमूर्त भाषा का संबंध है।
आप सबसे कुशल कोड उत्पन्न करने के लिए देखते हैं, यह संकलक वस्तुओं के जीवनकाल (चर) के जीवनकाल के संचालन के लिए पर्याप्त नहीं है। सबसे कुशल कोड उत्पन्न करने के लिए, कंपाइलर को बहुत अधिक स्तर पर काम करना चाहिए: इसे मानों के जीवनकाल के संदर्भ में "सोचें" चाहिए। एक उदाहरण के लिए, सीपीयू रजिस्टरों के कुशल शेड्यूलिंग करने के लिए यह बिल्कुल जरूरी है।
अमूर्त भाषा में "जीवन का मूल्य" जैसी कोई अवधारणा नहीं है। हालांकि, भाषा लेखक ऑप्टिमाइज़िंग कंपाइलर्स को उस अवधारणा के महत्व को पहचानते हैं। कुशल अनुकूलन करने के लिए संकलकों को पर्याप्त स्वतंत्रता देने के लिए, भाषा जानबूझकर निर्दिष्ट की जाती है ताकि यह महत्वपूर्ण अनुकूलन में हस्तक्षेप न करे। यह वह जगह है जहां "कचरा मूल्य" चित्र में आते हैं। भाषा यह नहीं बताती है कि कचरा मूल्य कहीं भी संग्रहीत किया जाता है, भाषा गारंटी नहीं देती है कि कचरा मूल्य स्थिर हैं (यानी एक ही अनियमित चर को पढ़ने के बार-बार प्रयासों को आसानी से "कचरा मूल्य" अलग-अलग परिणाम मिल सकता है)।यह विशेष रूप से "मूल्य के जीवनकाल" की महत्वपूर्ण अवधारणा को लागू करने के लिए अनुकूलित करने वाले संकलकों को अनुमति देने के लिए किया जाता है और इस प्रकार "ऑब्जेक्ट आजीवन" की भाषा अवधारणा द्वारा निर्धारित किए जाने के मुकाबले अधिक कुशल परिवर्तनीय हेरफेर निष्पादित करता है।
सी मानक अनिश्चित चर का उपयोग क्यों अनिश्चित है?
यह नहीं करता है: (Why) is using an uninitialized variable undefined behavior?
वैश्विक के लिए:
- स्थानीय चर के लिए
, यह अनिर्धारित व्यवहार, जिसका अर्थ है कुछ भी (जैसे segfault, अपनी हार्ड डिस्क को मिटाकर) कानूनी है कि कहते हैं चर, यह शून्य है: What happens to a declared, uninitialized variable in C? Does it have a value?
- 1. क्यों संकलक बताए छोड़ देता है तो चर
- 2. को छोड़ देता है क्वालिफायर त्रुटि
- 3. sed कई फ़ाइलों को क्यों छोड़ देता है?
- 4. Element.prototype क्यों अनिश्चित है?
- 5. chrome.browserAction.onClished क्यों अनिश्चित है?
- 6. PHP एसक्यूलाइट छोड़ देता है?
- 7. मैवेन 3 क्यों समर्थन अनुप्रयोग $ संस्करण घोषणा छोड़ देता है?
- 8. गुजर 'स्थिरांक इस तर्क को छोड़ देता है क्वालिफायर [-fpermissive]
- 9. क्या django staticfiles मिडलवेयर छोड़ देता है?
- 10. सी के सरणी वाक्यविन्यास का बिंदु क्या है यदि यह लंबाई डेटा छोड़ देता है?
- 11. EnumChildWindows बच्चों को क्यों छोड़ रहा है?
- 12. क्या होता है जब सी ++ संदर्भ इसके दायरे को छोड़ देता है?
- 13. यदि कोई व्हाइटस्पेस विभाजक नहीं है तो XmlReader हर दूसरे तत्व को क्यों छोड़ देता है?
- 14. पीएचपी mkdir ($ पुनरावर्ती = सच) को छोड़ देता है पिछले निर्देशिका
- 15. क्या सी ++ 11 मानक कुछ बढ़ावा देता है :: कोई भी?
- 16. क्या दृश्यता = IsCollapsed डेटा बाध्यकारी भाग को छोड़ देता है?
- 17. क्या मजबूत-नामकरण के बिना कोड-हस्ताक्षर आपके ऐप को दुरुपयोग के लिए छोड़ देता है?
- 18. क्या सी # में अनिश्चित तिथियों का प्रतिनिधित्व करने का एक मानक तरीका है?
- 19. क्यों सी ++ एक चर
- 20. क्यों संकलक रूपांतरण को संकुचित करने की अनुमति देता है
- 21. सी छोड़ पारी असफल
- 22. लिंक-टू-एक्सएमएल XElement.Remove() अवांछित व्हाइटस्पेस छोड़ देता है
- 23. जावास्क्रिप्ट घटना जब माउस ब्राउज़र विंडो छोड़ देता है
- 24. संकलक इस पर्ची को क्यों देता है?
- 25. Array.pop छोड़ देता है और एक समारोह आइटम
- 26. आईओएस पूर्ण स्क्रीन वेब ऐप कुकीज़ छोड़ देता है?
- 27. एंड्रॉइड: CountDownTimer आखिरी बार टिक() पर छोड़ देता है!
- 28. सी मानक को संबोधित सरलीकरण विसंगति
- 29. सी ++ 11 मानक गारंटी के समान बीज के लिए समान यादृच्छिक संख्या गारंटी देता है?
- 30. यह कोड EXC_BAD_ACCESS (IMP का उपयोग करके) क्यों देता है
कचरा मूल्य "संग्रहीत" नहीं होते हैं और कोई "उद्देश्य" नहीं देते हैं। वे एक अनियमित वैरिएबल द्वारा कब्जा कर लिया गया स्मृति स्थान में जो कुछ भी होता है वह बस होता है। – Cogwheel
बहुत तेज तेज़। यह एक प्रश्न है। यह बेहतर समझाया जा सकता है (कर सकता/चाहिए)। लेकिन यह एक सवाल है। शायद एक डुप्लिकेट, लेकिन यह एक सवाल है। मेरा चल रहा जवाब था: >> – ShinTakezou
कचरा मूल्य जानबूझकर संग्रहीत नहीं किया जाता है। बस, स्मृति और रजिस्ट्रार मान रखते हैं। यदि कोई भी उन्हें जो भी दिलचस्पी लेता है (किसी फ़ंक्शन के कॉलर की तरह) के लिए अर्थपूर्ण कुछ भी सेट करता है, तो ऐसा होता है कि "कॉलर" को "कचरा" मान मिलता है, यानी स्मृति के क्षेत्र या किसी रजिस्टर को एक्सेस किया जाता है जिसे कोई भी सेट नहीं करता है सार्थक मूल्य, तो यह हो सकता है कि जो भी पहले उस स्मृति के स्वामित्व में है, या अंतिम गणना, या किसी अन्य "अप्रत्याशित" तथ्य के अनुसार हो सकता है। यदि आपका मतलब कुछ अलग है, तो अपना प्रश्न बेहतर निर्दिष्ट करें। – ShinTakezou