我正在阅读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将是多态的。

10-07 19:42
查看更多