“实例大小”存储在哪里?

问题描述 投票:0回答:1

根据地图布局,它似乎是要映射的TaggedPointer的下一个字段的第一个字节。 即使我查看堆内存中 DebugPrint 输出的值的地址,也无法确认“16”值。

var a = {message: "hello"};
%DebugPrint(a);

v8
1个回答
0
投票

看看实现

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
了解详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.