我正在阅读this article关于单态性的信息,其中有以下代码片段:
function ff(b, o) {
if (b) {
return o.x
} else {
return o.x
}
}
ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
ff(true, { x: 1 })
ff(false, { x: 2, y: 0 })
我以为会有一个多态的,因为作者早些时候表明:
f({ x: 4, y: 1 }) // polymorphic, degree 2
f({ x: 5, z: 1 }) // polymorphic, degree 3
f({ x: 6, a: 1 }) // polymorphic, degree 4
f({ x: 7, b: 1 }) // megamorphic
该函数传递了具有不同结构的对象,并且它们将单态缓存突变为多态。为什么与所讨论的示例不同?
最佳答案
这些“内联缓存”事物存在于代码中的每个不同属性引用处。因此在函数中:
function ff(b, o) {
if (b) {
return o.x // IC here
} else {
return o.x // IC here
}
}
这两个
return
语句每个都有自己的内联缓存。由于示例中调用函数的方式不同,第一个return
仅在第一个形状的对象上发生,而第二个ff()
仅在第二个形状的对象上发生。因此,每个缓存(在对ojit_code的这四个调用之后)只会看到1个形状。在第五次调用该函数之后:
ff(true, { x: 1, z: 10 });
那第一个IC会看到两种形状,所以它的IC将是多态的。