acyclic 编译指示

acyclic 编译指示用来指示对象类型是无环的,即使看起来像是有环的。 这个信息是一种 优化 ,有了这个信息垃圾回收器不再需要考虑这个类的对象构成环的情况:

  1. type
  2. Node = ref NodeObj
  3. NodeObj {.acyclic.} = object
  4. left, right: Node
  5. data: string

我们也可以直接使用引用对象类型:

  1. type
  2. Node {.acyclic.} = ref object
  3. left, right: Node
  4. data: string

这个例子里通过 Node 类型声明了一个树形结构。注意到这个类型的定义是递归的,GC 不得不考虑各对象可能构成一个有环图的情况。 acyclic 编译指示告知 GC 这不可能发生。如果程序员把 acyclic 编译指示赋予了实际上有环的数据类型,那么将导致内存泄露,但是不会破坏内存安全。