2012-05-03 5 views
8

मैंने देखा है कि ऑब्जेक्ट्स में उनकी आईडी को प्रतिबिंबित फैशन में असाइन किया गया है। पहले एक ऑब्जेक्ट बनाया गया था, इसकी ऑब्जेक्ट आईडी जितनी अधिक होगी। मैंने सोचा होगा कि उन्हें आस-पास के क्रम में आवंटित क्रम में असाइन किया गया होगा।रुबी ऑब्जेक्ट आईडी को अवरोही क्रम में क्यों निर्दिष्ट करता है?

उदाहरण के लिए:

obj1 = Object.new 
obj2 = Object.new 
obj3 = Object.new 

p obj1.object_id # => 4806560 
p obj2.object_id # => 4806540 
p obj3.object_id # => 4806520 

क्यों वे इस तरह से आवंटित कर रहे हैं और यह भी कारण है कि वहाँ एक 20 साल की रूबी दुभाषिया द्वारा चलाए कोड में 1 कदम है, बजाय है, लेकिन वस्तु के बीच एक बेहद अधिक से अधिक अंतर रुबी के आईआरबी द्वारा चलाए गए कोड के लिए आईडी?

+1

'object_id' सिर्फ एक पूर्णांक विशिष्ट एक वस्तु को दिखाता है कि है, कोई विशेष आदेश जो आपको लगता है कि आप देख रहे हैं वह पूरी तरह कार्यान्वयन कलाकृति है। –

+0

@theTinMan शेविंग याक्स? नहीं, मैं जिज्ञासा को पूरा करने की कोशिश कर रहा हूं। – Matty

उत्तर

14

handwaving, माणिक ढेर का एक हिस्सा आवंटित में वस्तुओं डाल करने के लिए: में-ताकि उन्हें

1 | 2 | 3 | 4 | 5 

फिर पार करता है और उन्हें मुक्त वस्तुओं की एक लिंक्ड सूची में जोड़ता है। इससे उन्हें लिंक्ड सूची पर उलटे क्रम में होना करने के लिए कारण बनता है:

freelist → NULL 
freelist → 1 → NULL 
freelist → 2 → 1 → NULL 
freelist → 3 → 2 → 1 → NULL 
freelist → 4 → 3 → 2 → 1 → NULL 
freelist → 5 → 4 → 3 → 2 → 1 → NULL 

एक वस्तु गहरे लाल रंग का आवंटन लिंक्ड सूची पर पहले आइटम का उपयोग करता है:

:

object = freelist 
freelist = object.next_free 

तो freelist अब की तरह दिखता है

freelist → 4 → 3 → 2 → 1 → NULL 

और आगे आवंटित वस्तुओं छोटे आवंटन में विपरीत क्रम में दिखाई देंगे।

जब रूबी को अधिक ऑब्जेक्ट्स स्टोर करने के लिए ढेर के एक नए हिस्से को आवंटित करने की आवश्यकता होती है तो आप ऑब्जेक्ट_आईडी कूदते हैं और फिर नीचे चलाते हैं।

2

रूबी दुभाषिया एक सी प्रोग्राम है, आप शायद वस्तुओं के संबंधित स्मृति पते को देख रहे हैं।

0

मैं सिर्फ वस्तु आईडी का एक लॉग भाग गया, और ऐसा लग रहा था कि यद्यपि बातें क्रम में चला गया, कचरा संग्रहण बातें अन्य रास्ता तय हर बार एक while.I में 2080 की तरह से छलांग देखा बनाने के लिए लग रहा था, तो यह लगभग यादृच्छिक प्रतीत होता है। लेकिन रूबी बनाए रखने वाली आंतरिक वस्तुओं की मात्रा के साथ, ऑब्जेक्ट ऑर्डर ऑर्डर पर निर्भर होने के लिए कुछ भी नहीं है। यह भी हो सकता है कि रुबी स्थानीय प्लेटफार्म के int या short के शीर्ष पर शुरू हो जाए ताकि बाहर चलने के लिए एक आसान परीक्षण (if(current_id==0) { problem }) की अनुमति मिल सके। मैंने अपनी विभिन्न संख्याओं से जो देखा है, उससे यह पूरी तरह अलग और गैर निर्धारणीय लगता है। यह (लगभग) मुझे लगता है जैसे रूबी ऑब्जेक्ट में पॉइंटर का उपयोग कर सकता है, क्योंकि यह अद्वितीय की गारंटी है, और ऑब्जेक्ट्स के बीच विशाल अंतराल (20 बाइट्स) की व्याख्या करेगा। जब मैं object_id द्वारा लौटाए गए मान को देखता हूं, और इसे अपने सिस्टम के मूल सूचक आकार (64 बिट इंटेल) के बगल में देखता हूं।

मैंने उसी प्रणाली पर एक परीक्षण सी ++ प्रोग्राम चलाया जिसने int पर एक सूचक मुद्रित किया। सूचक (दशमलव में) 140734848324996 था और रूबी ऑब्जेक्ट आईडी 70118105405380 थी। संख्याओं में बहुत आम नहीं है, लेकिन वे दोनों एक ही श्रेणी में हैं और पॉइंटर्स की तरह कुछ दिखते हैं।

बेशक, अगर कोई रूबी स्रोत में खोदता है और पता लगाता है, तो यह निश्चित जवाब होगा। मैं कोशिश कर रहा हूँ। कई विवरण पर

2

इसके लायक होने के लिए, आप विभिन्न कार्यान्वयन पर पूरी तरह से अलग प्रगति देख सकते हैं; प्रत्येक व्यक्ति अलग-अलग आकार की बाल्टी के साथ, अपनी वस्तुओं को एक अलग तरीके से आवंटित करता है।

एमआरआई 1.9.3

objs = [Object.new, Object.new, Object.new] 
objs.each {|o| puts o.object_id} 
# 70257700803740 
# 70257700803700 
# 70257700803680 

JRuby

objs = [Object.new, Object.new, Object.new] 
objs.each {|o| puts o.object_id} 
# 2048 
# 2050 
# 2052 

Rbx

objs = [Object.new, Object.new, Object.new] 
objs.each {|o| puts o.object_id} 
# 3920 
# 3924 
# 3928 
संबंधित मुद्दे