चलो सी/सी ++ शर्तों में इसकी चर्चा करें; सी # सरणी के बारे में जानने के लिए कुछ अतिरिक्त सामान हैं लेकिन यह बिंदु के लिए वास्तव में प्रासंगिक नहीं है।
16-बिट पूर्णांक मूल्यों की एक सरणी को देखते हुए:
short[5] myArray = {1,2,3,4,5};
क्या वास्तव में हुआ है कि कंप्यूटर स्मृति में अंतरिक्ष के एक ब्लॉक आवंटित किया है। यह मेमोरी ब्लॉक उस सरणी के लिए आरक्षित है, बिल्कुल पूर्ण सरणी (हमारे मामले में 16 * 5 == 80 बिट्स == 10 बाइट्स) रखने के लिए आवश्यक आकार है, और यह संगत है। ये तथ्य givens हैं; यदि किसी भी समय या उनमें से कोई भी आपके पर्यावरण में किसी भी समय सत्य नहीं है, तो आमतौर पर एक्सेस वायलओशन के कारण आपके प्रोग्राम को क्रैश होने का जोखिम होता है।
तो, इस संरचना को देखते हुए, दृश्य myArray
वास्तव में, दृश्यों के पीछे, स्मृति के ब्लॉक की शुरुआत का स्मृति पता है। यह भी, आसानी से, पहले तत्व की शुरुआत है। प्रत्येक अतिरिक्त तत्व क्रम में, पहले क्रम में स्मृति में रेखांकित किया गया है। स्मृति myArray
के लिए आवंटित ब्लॉक इस प्रकार दिखाई देंगे:
00000000000000010000000000000010000000000000001100000000000001000000000000000101
^ ^ ^ ^ ^
myArray([0]) myArray[1] myArray[2] myArray[3] myArray[4]
यह एक स्मृति पते का उपयोग और बाइट्स की एक निरंतर संख्या को पढ़ने के लिए एक निरंतर समय ऑपरेशन माना जाता है। उपर्युक्त आंकड़े के रूप में, यदि आप तीन चीजें जानते हैं तो आप प्रत्येक के लिए मेमोरी पता प्राप्त कर सकते हैं; मेमोरी ब्लॉक की शुरुआत, प्रत्येक तत्व का स्मृति आकार, और इच्छित तत्व की अनुक्रमणिका। इसलिए, जब आप अपने कोड में myArray[3]
के लिए पूछना, उस अनुरोध को एक स्मृति पते में निम्नलिखित समीकरण द्वारा दिया जाता है: एक निरंतर समय गणना के साथ
myArray[3] == &myArray+sizeof(short)*3;
इस प्रकार,, आप चौथे तत्व की स्मृति पता मिल गया है (सूचकांक 3), और एक और निरंतर समय के संचालन के साथ (या कम से कम माना जाता है; वास्तविक पहुंच जटिलता एक हार्डवेयर विवरण है और पर्याप्त तेज़ है कि आपको परवाह नहीं करनी चाहिए) आप उस स्मृति को पढ़ सकते हैं। यह है, यदि आपने कभी सोचा है, तो अधिकांश सी-शैली भाषाओं में संग्रहों की अनुक्रमणिका शून्य से क्यों शुरू होती है; सरणी के पहले तत्व सरणी के ही स्थान पर शुरू होता है, कोई ऑफसेट (sizeof (कुछ भी) * 0 == 0)
सी # में, वहाँ दो उल्लेखनीय मतभेद हैं। सी # सरणी में कुछ शीर्षलेख जानकारी होती है जो सीएलआर के उपयोग में होती है। शीर्ष लेख स्मृति ब्लॉक में पहले आता है, और इस शीर्ष लेख के आकार स्थिर है और जाना जाता है, इसलिए संबोधित कर रहे समीकरण सिर्फ एक मुख्य अंतर यह है:
myArray[3] == &myArray+headerSize+sizeof(short)*3;
सी # आप सीधे अपने प्रबंधित में स्मृति को संदर्भित करने की अनुमति नहीं है पर्यावरण, लेकिन रनटाइम ही ढेर से मेमोरी एक्सेस करने के लिए ऐसा कुछ उपयोग करेगा।
दूसरी बात, जो सी/सी के सबसे जायके के लिए आम है ++ के साथ-साथ, कि कुछ प्रकार हमेशा "संदर्भ द्वारा" के साथ पेश कर रहे हैं। बनाने के लिए आपको new
कीवर्ड का उपयोग करने के लिए कुछ भी संदर्भ प्रकार है (और कुछ ऑब्जेक्ट्स हैं, जैसे स्ट्रिंग्स, जो संदर्भ प्रकार भी हैं हालांकि वे कोड में मूल्य प्रकारों की तरह दिखते हैं)। एक संदर्भ प्रकार, जब तत्काल, स्मृति में रखा जाता है, स्थानांतरित नहीं होता है, और आमतौर पर प्रतिलिपि नहीं बनाई जाती है। इस ऑब्जेक्ट का प्रतिनिधित्व करने वाला कोई भी चर दृश्यों के पीछे, स्मृति में ऑब्जेक्ट का केवल स्मृति पता है। Arrays संदर्भ प्रकार हैं (याद रखें myArray सिर्फ एक स्मृति पता था)। संदर्भ प्रकारों की Arrays इन मेमोरी पतों के सरणी हैं, इसलिए किसी ऑब्जेक्ट को एक्सेस करना जो किसी सरणी में तत्व है, दो-चरणीय प्रक्रिया है; सबसे पहले आप सरणी में तत्व के स्मृति पते की गणना करते हैं, और उसे प्राप्त करते हैं।यह एक और स्मृति पता है, जो वास्तविक वस्तु का स्थान है (या कम से कम इसके परिवर्तनीय डेटा; स्मृति में कैसे मिश्रित प्रकार संरचित होते हैं, एक अन्य अन्य 'कीड़े) हो सकता है। यह अभी भी एक स्थिर समय ऑपरेशन है; एक के बजाय सिर्फ दो कदम।
आप जानते हैं कि कैसे डिस्क प्लैटर्स चारों ओर घूमते हैं? खैर, राम हिलता नहीं है ;-) –
यदि आप तत्काल घर # 20 पर कूद सकते हैं तो यह स्थिर रहेगा। रैम काम करता है। यादृच्छिक अभिगम बनाम अनुक्रमिक पहुंच। इस मामले में यादृच्छिक अर्थ है कि आप इससे पहले स्मृति को पढ़ने के बिना किसी भी "यादृच्छिक" स्मृति स्थान से पढ़ सकते हैं। वही लिखने के लिए जाता है। – SRM