2011-04-23 12 views
5

अज्ञात सरणी के लिए स्मृति पते स्वाभाविक रूप से perl द्वारा पुन: उपयोग किए जाते हैं। इस उदाहरण से पता चलता है, वे खाली सरणियों के लिए दो पते के बीच चक्र के रूप में:पर्ल इस पैटर्न के बाद स्मृति को फिर से आवंटित क्यों करता है?

$ perl -E "say [] for (1..6)" 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 
ARRAY(0x37b23c) 
ARRAY(0x37b28c) 

मैं क्यों यह स्मृति तुरंत पुनः आवंटित नहीं कर सकता है पर कुछ सिद्धांतों के साथ आया था, जब मैंने पाया कि चक्र हमेशा दो पते है लंबा। निम्नलिखित उदाहरण 'चक्र 3 और 4.

$ perl -E "say [0] for (1..6)" 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 
ARRAY(0x39b23c) 
ARRAY(0x39b2ac) 
ARRAY(0x39b28c) 

$ perl -E "say [0,0] for (1..6)" 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 
ARRAY(0x64b2ac) 
ARRAY(0x64b28c) 
ARRAY(0x64b23c) 
ARRAY(0x64b2cc) 

स्मृति प्रबंधन की इस विशिष्टता का क्या कारण बनता है?

+2

आपको परवाह क्यों है? –

+0

@ जोनाथन, मैं मॉड्यूल कैलकुलेशन लागू कर रहा हूं;) जिज्ञासा। – Tim

+0

आपको 'perldoc perlguts' पढ़ना चाहिए और पर्ल पोर्टर्स की मेलिंग सूची में शामिल होना चाहिए http://lists.perl.org/list/perl5-porters.html – shawnhcorey

उत्तर

2

जब एसवी मुक्त हो जाते हैं, तो वास्तव में उन्हें "मुक्त" पूल में डाल दिया जाता है। शायद जिस क्रम में वे पूल में प्रवेश करते हैं, वे उस क्रम को प्रभावित करते हैं जिसमें वे बाहर निकलते हैं।

1

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

शेष प्रश्न, इसलिए, चक्र की लंबाई "तत्वों की संख्या + 2" है। शायद यह सरणी के प्रत्येक तत्व के लिए एक एसवी का उपयोग कर रहा है, एक सरणी के लिए स्वयं, और $_ के लिए एक?

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