gpt4 book ai didi

string - Nim 中的字符串究竟是什么?

转载 作者:行者123 更新时间:2023-12-04 06:59:32 25 4
gpt4 key购买 nike

据我所知,Nim 中的字符串基本上是一个可变的字节序列,它们在赋值时被复制。

鉴于此,我假设 sizeof会告诉我(如 len )字节数,但它总是给出 8在我的 64 位机器上,所以它似乎拿着一个指针。

鉴于此,我有以下问题......

  • 抄作业的动机是什么?是因为它们是可变的吗?
  • 是否有过分配时没有复制的情况? (我假设非 var 函数参数不会被复制。还有别的吗?)
  • 它们是否经过优化,以便只有在发生变异时才真正被复制?
  • 字符串和序列之间是否存在显着差异,或者上述问题的答案是否可以同样适用于所有序列?
  • 一般还有什么值得注意的吗?

  • 谢谢!

    最佳答案

    字符串的定义其实在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 的对象的原始指针。 , reserveddata field 。字符串的过程在 sysstr.nim 中定义.

    默认情况下,字符串赋值的语义被选择为与 Nim 中所有值类型(不是 ref 或 ptr)的语义相同,因此您可以假设赋值创建了一个副本。当不需要副本时,编译器可以忽略它,但我不确定到目前为止发生了多少。将字符串传递到 proc 不会复制它们。没有优化可以防止字符串复制,直到它们发生变异。序列的行为方式相同。

    您可以通过将字符串和序列标记为浅层来更改字符串和序列的默认赋值行为,然后在赋值时不进行复制:
    var s = "foo"
    shallow s

    关于string - Nim 中的字符串究竟是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399939/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com