获取访问器是否会产生每个实例的分配成本?
Do get accessors incur a per-instance allocation cost?
假设我有一个 class 定义如下:
class Test {
get a() { return 1; }
get b() { return 2; }
get c() { return 3; }
get d() { return 4; }
get e() { return 5; }
get f() { return 6; }
get g() { return 7; }
get h() { return 8; }
}
然后我创建了几个这样的实例:
let a = new Test();
let b = new Test();
let c = new Test();
是否为每个实例分配了这些获取访问器?也就是说,如果我要添加更多的 get 访问器,这些对象中的每一个的内存使用量是否会增加,或者 get 访问器是否分配一次并在所有实例之间共享?
我尝试用 Chrome 的堆快照对其进行测试,它 似乎 就像我添加的内存使用量无关object 是相同的,但我不确定是否总是如此,或者在什么条件下它成立。
我想知道这个,因为我正在开发一个与内存分配相关的浏览器游戏。
(这里是 V8 开发人员。)与其他方法一样,访问器是按 class 存储的,而不是按实例存储的。只要按常规使用classes,就很难不小心弄错了。
当然,您可以通过在每个实例上显式存储函数实例来破坏此机制,例如如果您使用 traditional/ES5 非 class
构造函数并写入:
function MyObj {
this.field = 42;
this.method = function method(x) { ... }
}
var o1 = new MyObj();
var o2 = new MyObj(); // Fresh copy of `method`.
(当然,那时候建议用MyObj.prototype.method = function() {...}
代替。)
对于 classes,如果您在构造函数中进行类似的赋值,您将获得相同的效果。
假设我有一个 class 定义如下:
class Test {
get a() { return 1; }
get b() { return 2; }
get c() { return 3; }
get d() { return 4; }
get e() { return 5; }
get f() { return 6; }
get g() { return 7; }
get h() { return 8; }
}
然后我创建了几个这样的实例:
let a = new Test();
let b = new Test();
let c = new Test();
是否为每个实例分配了这些获取访问器?也就是说,如果我要添加更多的 get 访问器,这些对象中的每一个的内存使用量是否会增加,或者 get 访问器是否分配一次并在所有实例之间共享?
我尝试用 Chrome 的堆快照对其进行测试,它 似乎 就像我添加的内存使用量无关object 是相同的,但我不确定是否总是如此,或者在什么条件下它成立。
我想知道这个,因为我正在开发一个与内存分配相关的浏览器游戏。
(这里是 V8 开发人员。)与其他方法一样,访问器是按 class 存储的,而不是按实例存储的。只要按常规使用classes,就很难不小心弄错了。
当然,您可以通过在每个实例上显式存储函数实例来破坏此机制,例如如果您使用 traditional/ES5 非 class
构造函数并写入:
function MyObj {
this.field = 42;
this.method = function method(x) { ... }
}
var o1 = new MyObj();
var o2 = new MyObj(); // Fresh copy of `method`.
(当然,那时候建议用MyObj.prototype.method = function() {...}
代替。)
对于 classes,如果您在构造函数中进行类似的赋值,您将获得相同的效果。