可继承的对象结构

时间:2015-10-05 09:13:53

标签: inheritance layout nim

从我的实验中,我看到可继承对象以4个额外字节开始(我有32个cpu)。根据这一观察,我想知道:

  • 这取决于架构吗? (即64 cpu的8个字节)

  • 这些字节是如何使用的?这是一个领域还是几个领域?

  • 我定义了一个异构容器,它使用copyMem复制除了这四个字节之外的对象(我想要不使用变体的有条件的seqs)。我应该关心什么吗?

1 个答案:

答案 0 :(得分:3)

找出这类问题的好方法是查看中间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.}