字符串的定义实际上是 in 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中定义。
默认情况下,字符串赋值的语义已被选择为与 Nim 中的所有值类型(不是 ref 或 ptr)相同,因此您可以假设赋值创建一个副本。当不需要副本时,编译器可以将其排除在外,但我不确定到目前为止发生了多少。将字符串传递到 proc 不会复制它们。没有任何优化可以防止字符串复制,直到它们发生突变。序列的行为方式相同。
您可以通过将字符串和序列标记为浅层来更改它们的默认分配行为,然后在分配时不进行复制:
var s = "foo"
shallow s