Inheritance 可继承对象结构
从我的实验中,我看到可继承对象从4个额外字节开始(我有一个32 cpu)。通过观察,我想知道: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
- 这取决于架构吗?(即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.}