可继承的对象结构
Inheritable object structure
根据我的实验,我看到可继承对象以 4 个附加字节开头(我有 32 cpu)。通过这次观察,我想知道:
是否依赖架构? (即 64 cpu 的 8 个字节)
如何使用这些字节?是一个字段还是几个字段?
我定义了一个异构容器,它使用 copyMem 复制除了这四个字节之外的对象(我想要连续的序列而不使用变体)。我应该担心什么吗?
解决这类问题的一个好方法是查看中间 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.}
根据我的实验,我看到可继承对象以 4 个附加字节开头(我有 32 cpu)。通过这次观察,我想知道:
是否依赖架构? (即 64 cpu 的 8 个字节)
如何使用这些字节?是一个字段还是几个字段?
我定义了一个异构容器,它使用 copyMem 复制除了这四个字节之外的对象(我想要连续的序列而不使用变体)。我应该担心什么吗?
解决这类问题的一个好方法是查看中间 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.}