2

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

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

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

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

4

1 回答 1

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.}
于 2015-10-05T09:55:32.120 回答