2015-04-01 15 views
8

Da quello che ho capito, le stringhe in Nim sono fondamentalmente una sequenza mutabile di byte e che vengono copiate su incarico.Cosa sono esattamente le stringhe in Nim?

dato che, ho pensato che mi avrebbe detto sizeof (come len) il numero di byte, ma invece dà sempre 8 sulla mia macchina a 64 bit, così sembra essere in possesso di un puntatore.

Dato che, ho le seguenti domande ...

  • Qual è stata la motivazione dietro copia su incarico? È perché sono mutabili?

  • C'è mai un momento in cui non viene copiato quando viene assegnato? (Suppongo che i parametri di funzione non var non vengano copiati. Altro

  • Sono ottimizzati in modo tale da essere copiati solo se/quando vengono modificati?

  • C'è qualche differenza significativa tra una stringa e una sequenza, oppure le risposte alle domande precedenti possono essere ugualmente applicate a tutte le sequenze?

  • Qualcos'altro in generale degno di nota?

Grazie!

+0

per completezza, le vite di definizione stringa NIM [su GitHub] (https: //github.com/Araq/Nim/blob/master/lib/system.nim#L56) che potrebbe aiutare a spiegare perché riporta ciò che riporta. –

+1

@ Mike'Pomax'Kamermans: Grazie per il collegamento, ma non so cosa 'stringa * {.magic: String.}' Sta cercando di dirmi. ;-) –

+0

sì, non sono troppo sicuro neanche io, ho pensato che potrebbe essere una buona informazione avere nella domanda come un possibile vantaggio per le persone a scoprire cosa c'è di meglio di noi =) –

risposta

10

La definizione di stringhe in realtà è in system.nim, appena sotto un altro nome:

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 

Quindi una stringa è un puntatore ad un oggetto grezzo con un campo len, reserved e data. I proc per le stringhe sono definiti in sysstr.nim.

La semantica delle assegnazioni di stringhe è stata scelta per essere uguale a tutti i tipi di valore (non ref o ptr) in Nim per impostazione predefinita, quindi è possibile assumere che le assegnazioni creino una copia. Quando una copia è inutile, il compilatore può lasciarlo fuori, ma non sono sicuro di quanto stia accadendo finora. Passare le stringhe in un proc non le copia. Non c'è ottimizzazione che impedisca le copie di stringa fino a quando non vengono mutate. Le sequenze si comportano nello stesso modo.

È possibile modificare il comportamento assegnazione predefinita di stringhe e seguenti del regolamento provvisorio contrassegnandoli come superficiale, allora nessuna copia viene eseguita su incarico:

var s = "foo" 
shallow s 
+0

Grazie def-. Questo è molto utile e sembra che 'shallow' sarà utile. –

+2

oltre a '' shallow'' che abilita il comportamento di "copia come puntatore" per tutte le copie future, c'è anche un'operazione '' shallowCopy'' che può essere utilizzata solo in luoghi specifici. Sotto il cofano, le punture gestite in questo modo condivideranno la stessa allocazione di memoria conteggiata di riferimento. – zah

Problemi correlati