代码之家  ›  专栏  ›  技术社区  ›  M2tM

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

  •  1
  • M2tM  · 技术社区  · 14 年前

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

    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=新测试1();
    var object1b=new test1();

    var object2A=新的test2();
    var object2b=new test2();

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

    我只是想知道,非静态成员函数是否都是对单个原型定义的引用,或者它们是否被大量复制到每个函数中,从而有效地使test1和test2的内存使用翻倍。我认为它们被当作引用来处理,然后重写它们只会改变对内存中不同函数的引用,但是我不确定,我想澄清一下。

    谢谢!

    2 回复  |  直到 14 年前
        1
  •  1
  •   vulkanino    14 年前

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

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

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

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

    编辑(证明):

    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");
    

    我已经创建了10000个aclass对象,并测量了可执行文件占用6304kbyte,而创建10000个aclasstatic对象需要6284kb。这是不同的,但无关紧要。

        2
  •  0
  •   TobiHeidi    14 年前

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

    不要将成员函数设为静态以保存内存。如果你这样做了,你就会做错事。