堆栈条目的类型(在虚拟机中)



关于基于堆栈的虚拟机,我不太了解一些东西:存储在堆栈中的值的类型是什么?我的意思是,例如,如果我将一个整数推到堆栈上,很明显它的类型是一个 32 位整数。但是,如果我推送浮点数、字符串甚至对象引用(在 OOP 中(,它们的类型会发生变化。创建堆栈时,它是在堆栈上推送它们时确定它们的类型,还是堆栈具有预定义的条目类型,例如仅整数或指针?我真的想不通,所以任何帮助都值得赞赏。

有多种方法,我在这里只举几个例子。

在 V8 JavaScript 引擎 VM(来自 Chrome 浏览器和 Node.js(中,堆栈上的所有对象都指向一个结构,其结构可能类似于以下内容:

class Value {
char type;
union {
Number, String, Object, Array, Date, Set
}
};

Firefox 的 SpiderMonkey 的 JavaScript VM 在堆栈上保存 64 位值,这些值被称为 NaN-boxed。如果较高的 3 位都设置为1则接下来的几位用于确定对象类型,其余 48 位用作指向对象结构的指针。如果 3 个最高有效位不全是111则整个 64 位值是一个double

垃圾回收环境中的虚拟机堆栈通常必须保存同类对象,即相同类型的对象,而不是混合指针和整数,以便垃圾回收器可以成功地从堆栈开始递归地遍历和检查每个对象。例如,堆栈上看起来像0x123456789的值既可以是有效的整数,也可以是有效的指针,垃圾回收器不知道忽略它(如果它是一个整数(或取消引用它(到可能错误的内存位置(。

事实上,有一些高级垃圾收集器实际上可以处理堆栈中的混合数据,做出一些假设、猜测并保留额外的簿记。

最新更新