这一直是我的长期好奇心,我还没有去寻找剖析,并且还没有看到它(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是否足够智能,可以对函数进行单一引用?
基本上,如果我保持我的方法非静态将有:
就内存而言,与静态版本没有区别
10,000个小实例引用单个函数
10,000个函数字节码重复
在记忆中?
是的,内存使用会有所不同.基本上,因为在一种情况下,您有一个类,而在另一个案例中,您有一个类和10,000个实例.
但是,函数本身的代码不会重复10,000次.在任何一种情况下,内存中只有一个函数.抛开语义,实例方法几乎是一个静态函数,它将对实例的引用作为第一个参数传递.
在Actionscript中,这个参数对你来说是隐藏的,因为在大多数语言中都是如此(尽管其他人,比如Python,我认为,你会在函数定义中声明一个self
/ this
参数;你不必在调用时明确地传递它).
每个对象都存储对其方法的引用(在实际运行时类型中声明的方法以及继承的方法),通常在称为vtable的结构中.调用这些方法的协议通常涉及在表中查找函数并调用它来传递this
对调用该方法的对象的引用,以及其余的参数(如果有的话).
无论如何,静态选项在某些情况下可能是合法的选择(最明显的是当你没有状态要保留时,所以你真的不需要一个对象),但一般来说,实例方法更灵活,限制性较小.无论如何,我几乎在每种情况下都会说选择一个选项或另一个选项基于哪一个占用更少的内存是不明智的.