2009-12-21 23 views
5

कुछ हद तक अकादमिक प्रश्न, लेकिन: मूल्य प्रकार जैसे इंट वास्तव में काम कैसे काम करते हैं?वैल्यू प्रकार वास्तव में .NET में कैसे काम करता है?

मैंने यह पता लगाने के लिए mscorlib पर परावर्तक का उपयोग किया है कि System.Int32 कैसे कार्यान्वित किया गया है, और यह केवल एक स्ट्रक्चर है जो System.ValueType से प्राप्त होता है। मैं मूल्य धारण करने वाले बिट्स के ऐरे की रेखाओं के बीच कुछ ढूंढ रहा था, लेकिन मुझे केवल एक ऐसा क्षेत्र मिला जो int घोषित किया गया - जिसका अर्थ है कि यह एक परिपत्र संदर्भ है?

मेरा मतलब है, मैं "int i = 14;" लिख सकता हूं, लेकिन नंबर 14 को किसी भी तरह से संग्रहीत करने की आवश्यकता है, लेकिन मुझे "32-बिट्स का ऐरे" या पॉइंटर या कुछ नहीं मिला।

क्या यह कुछ जादू है जो संकलक करता है, और ये जादू प्रकार विनिर्देश का हिस्सा हैं? (सिस्टम के बारे में कैसे। एट्रिब्यूट या सिस्टम। अपवाद "विशेष" प्रकार हैं)

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

जैसा कि कहा गया है, सभी अकादमिक और काल्पनिक, लेकिन मैं हमेशा इसके बारे में सोचता था।

+0

वास्तव में महान प्रश्न, मैंने सोचा है कि जादू खुद क्या है। – Pierreten

+0

मैं भी, मैं इस सवाल की अपेक्षा कर रहा था कि कैसे मूल्य प्रकार काम करते हैं i.e. स्टैक बनाम ढेर आवंटित आदि, लेकिन मैं इसके बारे में उत्सुक हूं। – Davy8

+1

अपने संपादन को पुन: संपादित करें: जहां तक ​​मैं कह सकता हूं, यदि आप Int36 बनाना चाहते हैं, तो आपको इसे किसी भी तरह से सी # या आईएल में बाहर करना होगा, जो आपको पिछले 28 के साथ Int32 + Int8 या Int64 का उपयोग करने के लिए मजबूर करेगा बिट्स अनदेखा या जो कुछ भी। कच्चे अंतर्निहित आभासी मशीन में Int36 जोड़ने का एकमात्र तरीका है और यह समझता है कि बिट-स्तरीय प्रतिनिधित्व आपके स्वयं के सीएलआर ला ला मोनो या रोटर को लागू करना होगा। – itowlson

उत्तर

3

कुछ प्राचीन प्रकार जैसे पूर्णांक सीएलआई विनिर्देश का हिस्सा हैं। उदाहरण के लिए, इन प्रकार के मूल्यों को लोड करने के लिए ldc.i4 जैसे विशिष्ट आईएल निर्देश हैं, और आईएल निर्देश जैसे कि इन प्रकारों के विशिष्ट ज्ञान हैं। (int i = 14 का आपका उदाहरण, ldc.i4 14 का संकलन किया जाएगा करने के साथ 14 संकलित MSIL भीतर opcode के हिस्से के रूप में आंतरिक रूप से प्रतिनिधित्व किया।)

अधिक जानकारी के लिए, CLI spec, धारा 7.2 के विभाजन आईआईए देखते हैं, "निर्मित प्रकार । " (विशेष खंड के लिए कोई लिंक नहीं मिल रहा है, क्षमा करें।) अंतर्निहित प्रकार हैं: बूल, चार, ऑब्जेक्ट, स्ट्रिंग, फ्लोट 32, फ्लोट 64, int [8 | 16 | 32 | 64], हस्ताक्षरित int [8 | 1632 | 64], मूल int (IntPtr), देशी हस्ताक्षरित int, और typedref। स्पेक नोट करता है कि वे "बेस क्लास लाइब्रेरी में परिभाषित समान मान प्रकार हैं" जो मुझे लगता है कि इंट 32 वास्तव में "असली" int32 के आसपास मेटाडेटा रैपर का प्रकार है, जो वीईएस स्तर पर रहता है।

अन्य मूल्य प्रकार, जैसे System.Decimal, System.Drawing.Point या किसी भी structs जो आप अपने कोड में परिभाषित करते हैं, गैर-जादुई हैं।

+0

धन्यवाद। तो मेरे hypothetical Int36 उदाहरण में, मेरे पास एक अंतर्निहित प्रकार (यानी Int64 या bool [36]) का उपयोग करने के अलावा कोई अन्य विकल्प नहीं है और मेरे बाकी प्रकार को मैन्युअल रूप से कोड करें? –

+0

सही। अपने प्रश्न पर "अपनी संपादन" टिप्पणी देखें। जब तक आप अपना स्वयं का सीएलआर लागू नहीं करते हैं, तब तक आपके पास बिट-ट्विडलिंग स्तर तक पहुंच नहीं है। – itowlson

1

इंट 32 एक कंपाइलर आंतरिक प्रकार है, जिसका अर्थ है कि संकलक के पास इसका निपटारा करने के लिए विशेष तर्क है। ढांचे में Int32 का वास्तविक कार्यान्वयन अर्थहीन है।

यह ध्यान देने योग्य है कि Int16, Int32, UInt16, UInt32, सिंगल, डबल, इत्यादि लगभग उन प्रकारों से मेल खाते हैं जो x86 निर्देश सेट (और अन्य) के मूल हैं। एक इंट 36 प्रकार बनाना इसी प्रकार शुद्ध असेंबली कोड में नींव के रूप में देशी प्रकार का उपयोग करने की आवश्यकता होगी।

+0

धन्यवाद। हाँ, मुझे लगता है कि मैं किसी भी तरह के प्रदर्शन मुद्दों के सभी प्रकार में चलाऊंगा (संरेखण/पैडिंग, आईए 32 आदि पर 2 पढ़ने/लिखने की आवश्यकता है ...)। –

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