AS2: Хранятся ли функции, объявленные в классе как отдельные экземпляры, занимающие больше памяти для каждого экземпляра объекта? - PullRequest
1 голос
/ 24 сентября 2010

Мой вопрос касается использования памяти и объектов в 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 = new test1 ();
var object1b = new test1 ();

var object2a = new test2 ();
var object2b = new test2 ();

Является ли размер object1a + object1b больше размера object2a + object2b из-за того, что функции не являются статичными (и, возможно, копируются в каждый экземпляр объекта)? У меня нет Actionscript 3 для определения использования памяти, возможно, кто-то может проверить, как это ведет себя в AS 3, если это трудно определить в AS 2.

Мне просто интересно, являются ли все нестатические функции-члены ссылками на определения одного прототипа, или они копируются оптом в каждую функцию, эффективно удваивая использование памяти для test1 vs test2. Я предполагаю, что они обрабатываются как ссылки, а затем их переопределение просто меняет ссылку на другую функцию в памяти, но я не уверен и хотел бы немного пояснений.

Спасибо!

Ответы [ 2 ]

1 голос
/ 07 октября 2010

Нестатические свойства (поля псевдонимов, переменные-члены псевдонимов) имеют свои собственные копии для каждого экземпляра объекта класса.

Методы, статические или нет, существуют только в одной копии для каждого класса.

Это имеет смысл, если подумать: нет причины копировать поведение, которое не меняется.Только статус (переменные) меняются.

Единственное различие, которое я могу придумать между статическими и нестатическими методами, - это уровень видимости, то есть нестатический метод «видит» состояние объекта, тогда как статический метод не может, потому что он работает науровень класса.

edit (proof):

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

Я создал 10 000 объектов AClass и измерил, что исполняемый файл занимает 6304 Кбайт, а для создания 10 000 объектов AClassStatic требуется 6284 КБ.Это отличается, но не имеет значения.

0 голосов
/ 04 октября 2010

Методы не "копируются", как вы их называете, классы просто имеют ссылку на них.object1a + object1b может занять минимум памяти для хранения этих ссылок, но в большинстве случаев это незначительно.

НЕ делайте функции-члены статичными для экономии памяти.Если вы делаете это, вы делаете что-то не так.

...