2012-01-09 11 views
5

जब मैं एक सरणी चर को किसी अन्य सरणी चर में निर्दिष्ट करता हूं तो कितनी जानकारी कॉपी/साझा की जाती है?सरणी चर साझा करने वाली कितनी जानकारी साझा करते हैं?

int[] a = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; 
int[] b = a; 
a[0] = 42; 
writefln("%s %s", a[0], b[0]); // 42 42 

जाहिर है, a और b, एक ही पेलोड का हिस्सा है क्योंकि 42 में दो बार छपा है।

a ~= 10; 
writefln("%s %s", a.length, b.length); // 11 10 

a को जोड़ b परिवर्तन नहीं होता है, तो लंबाई पेलोड का हिस्सा प्रतीत नहीं होता है?

b = a; 
a ~= 11; 
b ~= 42; 
writefln("%s %s", a[11], b[11]); // 11 42 

क्या एक अनुरूप डी कार्यान्वयन भी 42 42 प्रिंट कर सकता है? b ~= 42a के अंदर 11 को ओवरराइट कर सकता है?

जब a और b एक दूसरे से अलग हो गए हैं? क्या डी पृष्ठभूमि में कुछ गाय कर रहा है?

उत्तर

7

डी में "Arrays" वास्तव में मौजूद नहीं है।

Slices do.

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

आप सामान्य रूप से स्मृति में सरणी की वास्तविक लंबाई को "सिकुड़ नहीं सकते" (हालांकि आप निश्चित रूप से टुकड़े की लंबाई को कम कर सकते हैं, इसलिए यह कम डेटा देखता है), जिससे समस्याएं उत्पन्न नहीं होती हैं।

आशा है कि क्या हो रहा है यह बताता है।

+0

में रखा जाता है? मैं इस धारणा के तहत था कि '~ =' के आमंत्रण दोहराने से वर्गवार से बेहतर प्रदर्शन होगा ... – fredoverflow

+0

@FredOverflow: हाँ, यह रैखिक है - यह संभवतः मूल सरणी में जोड़ता है, लेकिन चूंकि पुराना टुकड़ा केवल 'देखता है' मूल भाग (लंबाई की अपनी प्रति के माध्यम से), तो यह नहीं देखेगा कि आपने कुछ भी जोड़ा है। – Mehrdad

+0

तो '~ =' केवल तब तक कुशल है जब तक कोई साझाकरण न हो? इसका मतलब है कि 'बी = ए' किसी भी तरह पृष्ठभूमि में 'ए' को संशोधित करता है, है ना? – fredoverflow

3

array variables in D are equivalent to

struct array!T{ 
    size_t length; 
    T* ptr; 

} 

(प्लस अनुक्रमण और टुकड़ा करने की क्रिया के लिए कार्यान्वयन)

appending विशेष है कि यह मूल टुकड़ा रखने के लिए और अंत करने के लिए संलग्न कर सकते हैं। यह तब होता है केवल जब या तो सरणी के capacity काफी बड़ी है या तो करता है `~ =` हमेशा रैखिक जटिलता है realloc inplace का विस्तार कर सकते

इन अंतिम बातें जीसी

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