2015-04-01 4 views
8

जो मैं समझता हूं, निम में तार मूल रूप से बाइट्स का एक उत्परिवर्तनीय अनुक्रम होते हैं और इन्हें असाइनमेंट पर कॉपी किया जाता है।निम में तार क्या हैं?

यह देखते हुए कि, मैं मान लिया है कि sizeof मुझे (जैसे len) बाइट की संख्या कहते थे, लेकिन इसके बजाय यह हमेशा मेरे 64-बिट मशीन पर 8 देता है, तो यह एक सूचक पकड़े जा रहा है।

यह देखते हुए कि, मैं निम्नलिखित प्रश्न हैं ...

  • काम पर प्रतिलिपि के पीछे प्रेरणा क्या था? क्या ऐसा इसलिए है क्योंकि वे उत्परिवर्तनीय हैं?

  • क्या कभी ऐसा समय होता है जब इसे आवंटित किए जाने पर कॉपी नहीं किया जाता है? (मुझे लगता है कि गैर-var फ़ंक्शन पैरामीटर कॉपी नहीं करते हैं। कुछ और?)

  • क्या वे इस तरह अनुकूलित हैं कि वे वास्तव में प्रतिलिपि किए जाते हैं यदि वे उत्परिवर्तित होते हैं?

  • क्या स्ट्रिंग और अनुक्रम के बीच कोई महत्वपूर्ण अंतर है, या उपरोक्त प्रश्नों के उत्तर सभी अनुक्रमों पर समान रूप से लागू हो सकते हैं?

  • सामान्य मूल्य में कुछ और ध्यान देने योग्य?

धन्यवाद!

+0

निम स्ट्रिंग परिभाषा जीवन [GitHub पर] (https:

आप उन्हें के रूप में उथले चिह्नित करके तार और seqs की डिफ़ॉल्ट असाइनमेंट व्यवहार को बदल सकते, तो कोई प्रतिलिपि काम पर किया जाता है: //github.com/Araq/Nim/blob/master/lib/system.nim#L56) जो यह समझाने में सहायता कर सकता है कि यह रिपोर्ट करता है कि यह रिपोर्ट क्यों करता है। –

+1

@ माइक'पोमैक्स 'कमरमैन: लिंक के लिए धन्यवाद, लेकिन मुझे नहीं पता कि' स्ट्रिंग * {। मैजिक: स्ट्रिंग।} 'मुझे क्या बताने की कोशिश कर रहा है। ;-) –

+0

हाँ, मुझे खुद को भी यकीन नहीं है, बस यह पता लगाया जा सकता है कि प्रश्नों में यह जानने के लिए अच्छी जानकारी हो सकती है कि हमारे लिए क्या हो रहा है यह जानने में लोगों के लिए एक संभावित लीड =) –

उत्तर

10

तार की परिभाषा वास्तव में, system.nim में है सिर्फ एक और नाम के तहत:

type 
    TGenericSeq {.compilerproc, pure, inheritable.} = object 
    len, reserved: int 
    PGenericSeq {.exportc.} = ptr TGenericSeq 
    UncheckedCharArray {.unchecked.} = array[0..ArrayDummySize, char] 
    # len and space without counting the terminating zero: 
    NimStringDesc {.compilerproc, final.} = object of TGenericSeq 
    data: UncheckedCharArray 
    NimString = ptr NimStringDesc 

तो एक स्ट्रिंग एक len, reserved और data क्षेत्र के साथ एक वस्तु के लिए एक कच्चे सूचक है। तारों के लिए procs sysstr.nim में परिभाषित किया गया है।

स्ट्रिंग असाइनमेंट के अर्थशास्त्र को डिफ़ॉल्ट रूप से निम में सभी मान प्रकारों (रेफरी या पीआरटी) के समान नहीं चुना गया है, इसलिए आप मान सकते हैं कि असाइनमेंट एक प्रतिलिपि बनाते हैं। जब एक प्रति अनचाहे होती है, तो संकलक इसे छोड़ सकता है, लेकिन मुझे यकीन नहीं है कि अब तक कितना हो रहा है। एक proc में तारों को पारित करने से उन्हें कॉपी नहीं किया जाता है। कोई अनुकूलन नहीं है जो स्ट्रिंग प्रतियों को तब तक रोकता है जब तक वे उत्परिवर्तित नहीं हो जाते। अनुक्रम एक ही तरीके से व्यवहार करते हैं।

var s = "foo" 
shallow s 
संपूर्णता के लिए
+0

धन्यवाद def-। यह बहुत उपयोगी है और ऐसा लगता है कि 'उथला' उपयोगी होगा। –

+2

'' उथो' 'के अलावा जो सभी भविष्य की प्रतियों के लिए "सूचक के रूप में प्रतिलिपि" व्यवहार को सक्षम बनाता है, वहां '' उथला कॉपी' ऑपरेशन भी होता है जिसे केवल विशिष्ट स्थानों में उपयोग किया जा सकता है। हुड के तहत, इस तरह से डंक किए गए डंक एक ही रेफ-गिनती स्मृति आवंटन साझा करेंगे। – zah

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