2015-04-01 2 views
8

Из того, что я понимаю, строки в Nim в основном являются изменяемой последовательностью байтов и что они копируются при назначении.Что такое струны в Ниме?

Учитывая, что я предположил, что sizeof говорил мне (как len) количество байт, но вместо этого он всегда дает 8 на моем 64-битной машине, так что, похоже, держит указатель.

Учитывая, что у меня есть следующие вопросы ...

  • Что было причиной копии на уступки? Это потому, что они изменяемы?

  • Есть ли время, когда оно не копируется при назначении? (Я предполагаю, что параметры не var не копируются. Что-нибудь еще?)

  • Они оптимизированы так, что они на самом деле копируются только в том случае, если они мутированы?

  • Есть ли существенная разница между строкой и последовательностью или ответы на вышеуказанные вопросы одинаково применимы ко всем последовательностям?

  • Что-нибудь еще в целом стоит отметить?

Спасибо!

+0

для полноты, жизнь определения NIM строки [на GitHub] (HTTPS: //github.com/Araq/Nim/blob/master/lib/system.nim#L56), который может помочь объяснить, почему он сообщает, что он сообщает. –

+1

@ Mike'Pomax'Kamermans: Спасибо за ссылку, но я не знаю, что 'string * {.magic: String.}' Пытается сказать мне. ;-) –

+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. Проки для строк определены в sysstr.nim.

Семантика назначений строк была выбрана так же, как для всех типов значений (не ref или ptr) в Nim по умолчанию, поэтому вы можете предположить, что назначения создают копию. Когда копия не нужна, компилятор может ее оставить, но я не уверен, сколько это происходит. Передача строк в proc не копирует их. Нет оптимизации, которая предотвращает копирование строк до тех пор, пока они не будут мутированы. Последовательности ведут себя одинаково.

Вы можете изменить поведение присваивания по умолчанию строк и seqs, пометив их как мелкие, то копия не делается по заданию:

var s = "foo" 
shallow s 
+0

Спасибо def-. Это очень полезно, и кажется, что «мелкий» будет полезен. –

+2

, кроме '' мелкой'', которая позволяет выполнять операцию «копировать как указатель» для всех будущих копий, существует также операция '' shallowCopy', которая может использоваться только в определенных местах. Под капотом, укусы, управляемые таким образом, будут использовать одно и то же количество памяти, подсчитанное по рефлектограмме. – zah

 Смежные вопросы

  • Нет связанных вопросов^_^