可继承的对象结构

Inheritable object structure

根据我的实验,我看到可继承对象以 4 个附加字节开头(我有 32 cpu)。通过这次观察,我想知道:

解决这类问题的一个好方法是查看中间 C 文件。我编译了这个文件:

type Foo = object {.inheritable.}
  x: int

var a: Foo
echo sizeof(a)

nim -d:release c x 编译后,查看 nimcache/x.c 显示:

struct  Foo118004  {
TNimType* m_type;
NI x;
};

所以只存储了一个指向 TNimType 对象的指针。指针的大小和 Foo 对象的对齐取决于系统和编译器,但对于 x86_64 应该是 8 个字节,对于 x86 应该是 4 个字节。 TNimType 本身可以在 lib/system/hti.nim 中找到并且定义如下:

TNimType {.codegenType.} = object
  size: int
  kind: TNimKind
  flags: set[TNimTypeFlag]
  base: ptr TNimType
  node: ptr TNimNode # valid for tyRecord, tyObject, tyTuple, tyEnum
  finalizer: pointer # the finalizer for the type
  marker: proc (p: pointer, op: int) {.nimcall, benign.} # marker proc for GC
  deepcopy: proc (p: pointer): pointer {.nimcall, benign.}