如何使用 Nim 在堆栈上开发?

cmc*_*cmc 4 garbage-collection memory-management stack-memory nim-lang

我想在软实时上下文中使用 Nim,其中内存分配和垃圾收集都表现出过多的延迟。因此,手动内存管理是可取的 - 或者更好的是,专门从堆栈内存工作。

我可以使用 Nim 的哪个子集来实​​现仅堆栈内存分配?我猜我可以通过缓存的 C 代码中没有 memset 或 memcpy 来判断它是否有效。

Grz*_*icz 6

如果您真的不想进行垃圾回收,则需要使用--gcnone参数的 ,如Nim 编译器用户指南 中所述。该none参数禁用垃圾收集器,让您自行处理。这通常意味着任何字符串操作都会产生警告,因为尽管分配了内存,但稍后没有人释放它:

proc main() =
  let x = 5
  echo "Hello " & $x & " there"

main()
Run Code Online (Sandbox Code Playgroud)

如果你编译这个小测试,nim c --gc:none -r test.nim你会得到 gc 警告:

test.nim(3, 19) Warning: '$ x' uses GC'ed memory [GcMem]
test.nim(3, 22) Warning: '&("Hello ", $ x, " there")' uses GC'ed memory [GcMem]
Run Code Online (Sandbox Code Playgroud)

这可以帮助您直接或间接地了解 Nim 的哪些部分在无 GC 环境中可以安全使用。但是请注意,某些操作可以移至编译阶段。因此,以下生成相同输出的示例无需 GC 即可安全使用,因为所有const表达式都是由生成的 C 代码静态分配的:

proc main() =
  const x = 5
  echo "Hello " & $x & " there"

main()
Run Code Online (Sandbox Code Playgroud)

查看nimcache目录内部,您会发现源代码包含类似于以下内容的行:

  STRING_LITERAL(TM_ipcYmBC9bj9a1BW35ABoB1Kw_2, "Hello 5 there", 13);
Run Code Online (Sandbox Code Playgroud)

不过,请注意,在上面提到的文档中,有一个指向Nim 的垃圾收集器文档的链接,其中包含一个非常具体的实时支持部分,这可能会有所帮助,并且如果它提供的妥协满足您的要求,则可能避免您手动处理内存的痛苦要求。