2
从我的实验中,我看到可继承对象以4个附加字节(我有32个CPU)开始。从这个观察,我想知道:可继承对象结构
它取决于体系结构? (即64个CPU的8字节)
这些字节是如何使用的?它是一个领域还是几个?
我定义了一个异构容器,它使用copyMem复制对象,除了这四个字节(我想要不使用变体的连续seqs)。我应该关心一些事情吗?
从我的实验中,我看到可继承对象以4个附加字节(我有32个CPU)开始。从这个观察,我想知道:可继承对象结构
它取决于体系结构? (即64个CPU的8字节)
这些字节是如何使用的?它是一个领域还是几个?
我定义了一个异构容器,它使用copyMem复制对象,除了这四个字节(我想要不使用变体的连续seqs)。我应该关心一些事情吗?
找出这种问题的一个好方法就是看中间的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.}