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.}