这一直是我的一个长期的好奇心,我还没有来得及分析以找出答案,也还没有看到它被问到(对于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是否足够聪明,可以对该函数进行单个引用?
基本上,如果我保持我的方法是非静态的,就会有:
与静态版本没有区别只要内存是concerned
在记忆里?
发布于 2010-11-17 01:49:23
是的,内存的使用会有所不同。基本上,因为在一种情况下,您有一个类,而在另一个类中,您有一个类和10000个实例。
不过,函数本身的代码不会重复10,000次。在这两种情况下,内存中只有一个函数。撇开语义不谈,实例方法基本上是一个静态函数,它将对实例的引用作为其第一个参数传递。
这个参数在Actionscript中是隐藏的,就像在大多数语言中一样(虽然我认为其他语言,比如Python,让您在函数定义中声明一个self/this参数;但是,您不必在调用时显式地传递它)。
每个对象都存储对其方法的引用(在实际运行时类型中声明的方法以及继承的方法),通常是在一个名为vtable的结构中。调用这些方法的协议通常包括在表中查找函数,并调用它传递对调用该方法的this对象的引用,以及其余的参数(如果有的话)。
无论如何,静态选项在某些情况下可能是一个合法的选择(最明显的是当您没有状态可保留时,因此您确实不需要对象),但是一般来说,实例方法更灵活,限制性更小。无论如何,我会说,在几乎每一种情况下,选择一种或另一种选择都是不明智的,因为其中一种选择占用的内存较少。
https://stackoverflow.com/questions/4200602
复制相似问题