使用静态与实例方法的AS3对象内存使用

时间:2010-11-17 01:02:07

标签: actionscript-3

这是我长期以来的好奇心,我还没有去寻找剖析,并且还没有看到它(AS3):

假设我有一个班级:

class MyClass {
   public function myMethod():String {
       return "some return value";
   }
}

将被实例化很多次:

for (var i:Number = 0; i < 10000; i++) {
   var myObject:MyClass = new MyClass();
   trace(myObject.myMethod);
}

myMethod更改为静态是否会对我的应用内存占用有任何改变?

mxmlc是否足够智能,可以对该函数进行单一引用?

基本上,如果我保持我的方法非静态,那么会有:

  1. 就内存而言,与静态版本没有区别
  2. 对单个函数的10,000个小实例引用
  3. 10,000个函数字节码重复
  4. 在记忆中?

1 个答案:

答案 0 :(得分:6)

是的,内存使用量会有所不同。基本上,因为在一种情况下,您有一个类,而在另一个案例中,您有一个类和10,000个实例。

但是,函数本身的代码不会重复10,000次。在任何一种情况下,内存中只有一个函数。抛开语义,实例方法几乎是一个静态函数,它将对实例的引用作为第一个参数传递。

这个参数在Actionscript中对你隐藏,就像在大多数语言中一样(尽管其他人,比如Python,我认为,你会在函数定义中声明一个self / this参数;你不要不过必须在通话时明确传递它。)

每个对象都存储对其方法的引用(在实际运行时类型中声明的方法以及继承的方法),通常在称为vtable的结构中。调用这些方法的协议通常涉及在表中查找函数并调用它来传递对调用该方法的this对象的引用,以及其余参数(如果有的话)。

无论如何,静态选项在某些情况下可能是合法的选择(最明显的是当你没有状态要保留,所以你真的不需要一个对象),但一般来说,一个实例方法是更灵活,限制更少。无论如何,我几乎在所有情况下都会说,选择一个选项或另一个选项基于哪一个占用更少的内存是不明智的。