Inheritance 可继承对象结构

Inheritance 可继承对象结构,inheritance,layout,nim-lang,Inheritance,Layout,Nim Lang,从我的实验中,我看到可继承对象从4个额外字节开始(我有一个32 cpu)。通过观察,我想知道: 这取决于架构吗?(即64 cpu的8字节) 这些字节是如何使用的?是一个领域还是几个领域 我定义了一个异构容器,该容器使用copyMem复制除这四个字节之外的对象(我希望连续的seq不使用变体)。我应该担心什么吗 解决这类问题的一个好方法是查看中间C文件。我编译了这个文件: type Foo = object {.inheritable.} x: int var a: Foo echo siz

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

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

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

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


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

      type Foo = object {.inheritable.}
        x: int
      
      var a: Foo
      echo sizeof(a)
      
      使用
      nim-d:release cx
      编译后,查看
      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.}