Flash AS2:类中声明的函数是否存储为单独的实例,在实例化的每个对象上占用更多内存?

Flash AS2:类中声明的函数是否存储为单独的实例,在实例化的每个对象上占用更多内存?,flash,memory,memory-management,actionscript-2,Flash,Memory,Memory Management,Actionscript 2,我的问题是关于actionscript 2中的内存使用和对象。如果我有一个类定义: class test1{ public function one(){trace("Hello");} public function two(){trace("World");} } 第二类定义: class test2{ static public function one(){trace("Hello");} static public function two(){tra

我的问题是关于actionscript 2中的内存使用和对象。如果我有一个类定义:

class test1{
    public function one(){trace("Hello");}
    public function two(){trace("World");}
}
第二类定义:

class test2{
    static public function one(){trace("Hello");}
    static public function two(){trace("World");}
}
然后我做了以下工作:

var object1a=newtest1()
var object1b=newtest1()

var object2a=newtest2()
var object2b=newtest2()

由于函数不是静态的(并且可能被复制到每个对象实例化中),object1a+object1b的大小是否大于object2a+object2b的大小?我没有ActionScript3来检测内存使用情况,如果在AS2中很难确定,也许有人可以检查AS3中的行为

我只是想知道非静态成员函数是否都是对单个原型定义的引用,或者它们是否被大量复制到每个函数中,从而使test1和test2的内存使用量增加了一倍。我想象它们被视为引用,然后重写它们只是将引用更改为内存中的另一个函数,但我不确定,我想澄清一下

谢谢

这些方法并不像您所说的那样“复制”,类只是对它们进行了引用。object1a+object1b可能需要最少的内存来存储这些引用,但在大多数情况下都可以忽略不计

不要将成员函数设置为静态以节省内存。如果你这么做了,你就做错了。

这些方法不是你所说的“复制”的,这些类只是引用了它们。object1a+object1b可能需要最少的内存来存储这些引用,但在大多数情况下都可以忽略不计

不要将成员函数设置为静态以节省内存。如果您这样做,您就做错了。

非静态属性(别名字段、别名成员变量)对于类的每个对象实例都有自己的副本

方法(无论是否为静态)对于每个类只存在一个副本

如果你仔细想想,这是有道理的:没有理由复制一个不变的行为。只有状态(变量)才会改变

我能想到的静态方法和非静态方法之间的唯一区别是可见性级别,即非静态方法“看到”对象状态,而静态方法不能,因为它在类级别上工作

编辑(证明):

我已经创建了10000个AClass对象,并测量到可执行文件占用6304KB,而创建10000个AClassStatic对象需要6284KB。它是不同的,但不相关。

非静态属性(别名字段、别名成员变量)对于类的每个对象实例都有自己的副本

方法(无论是否为静态)对于每个类只存在一个副本

如果你仔细想想,这是有道理的:没有理由复制一个不变的行为。只有状态(变量)才会改变

我能想到的静态方法和非静态方法之间的唯一区别是可见性级别,即非静态方法“看到”对象状态,而静态方法不能,因为它在类级别上工作

编辑(证明):


我已经创建了10000个AClass对象,并测量到可执行文件占用6304KB,而创建10000个AClassStatic对象需要6284KB。这是不同的,但不相关。

我知道这是一个有点奇怪的问题,我真的希望能有一些见解。我想在这个问题上悬赏,但我没有悬赏链接出现。我能得到一些帮助吗?啊,我自己只是需要更多的分数!赏金开始我知道这是一个有点奇怪的问题,我真的希望有一些见解。我想在这个问题上悬赏,但我没有悬赏链接出现。我能得到一些帮助吗?啊,我自己只是需要更多的分数!赏金开始你真的有测试这个的指标吗?你的消息来源是什么?我想你是对的,但我不想违背直觉。谢谢有一次我用taskmanager测试了它,创建了很多带有静态/非静态函数的对象。我希望响应的粒度更大一些,因此我暂缓接受这个答案。Taskmanager在内存使用的基准测试方面做得很差,几乎一文不值。您是否有任何指标来测试这一点?你的消息来源是什么?我想你是对的,但我不想违背直觉。谢谢有一次我用taskmanager测试了它,创建了很多带有静态/非静态函数的对象。我希望响应的粒度更大一些,因此我暂缓接受这个答案。Taskmanager在内存使用基准测试方面很差,几乎一文不值。谢谢,这正是我想要的。当你说可执行文件占用6304KB对6284KB时,你是指可执行文件的大小,还是执行期间内存使用的高水位线?我是指内存使用,对不起。谢谢,这正是我想要的。当你说可执行文件占用6304KB对6284KB时,你是指可执行文件的大小,还是执行期间内存使用的高水位线?对不起,我是指内存使用。
AClassStatic.as
class AClassStatic
{
    public static function f():Void  { return ; }
    public static function g():Void  { return ; }
        public static function h():Void  { return ; }
}


AClass.as
class AClass
{
    public function f():Void { return ; }
    public function g():Void { return ; }
    public function h():Void { return ; }
}

test.fla
import AClass
import AClassStatic

var obj1:AClass  = new AClass ();
var obj2:AClassStatic = new AClassStatic ();

if ( sizeof(obj1) == sizeof(obj2) )
    trace("equal");