根据地图布局,它似乎是要映射的TaggedPointer的下一个字段的第一个字节。 即使我查看堆内存中 DebugPrint 输出的值的地址,也无法确认“16”值。
var a = {message: "hello"};
%DebugPrint(a);
看看实现:
int Map::instance_size_in_words() const {
return RELAXED_READ_BYTE_FIELD(*this, kInstanceSizeInWordsOffset);
}
int Map::instance_size() const {
return instance_size_in_words() << kTaggedSizeLog2;
}
因此实例大小存储为字数,而不是字节数,并且
kInstanceSizeInWordsOffset
是4
。所以,在你的输出中:
0x...95D8: 61 00 00 00 04 03 ...
^^
第五个字节
04
是实例大小(以字为单位;由于指针压缩,每个字为 4 个字节)。
由于映射中的该字段只有一个字节大,因此可以通过这种方式存储的最大实例大小为 255 个字(或 1020 个字节)。较大的对象需要使用不同的机制,请参阅
SizeFromMap
了解详细信息。