|
|
|||||
Цитата:
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
для неизвестного типа есть обобщенный тип *, без кастов передача ссылки, это будет лучше чем Object в данном случае
public final class ObjectPool { private var pool:Vector.<*>; private var counter:uint; private var className:Class; public function ObjectPool (className:Class, length:uint = 1) { this.className = className; pool = new Vector.<*>(length); var i:uint = counter = length; //создадим начальный набор объектов while (--i > -1) { pool[i] = new className(); } } public function getObject ():* { if (counter > 0) { return pool[--counter]; } // если объекты закончились // создаю объект и увеличивая длину массива pool.unshift(new className()); return pool[0]; } public function releaseObject (value:*):void { pool[counter++] = value; } // необязательный метод для тестирования public function toString ():String { return "Pool of " + className + " count = " + counter + "/" + pool.length; } } var pool:ObjectPool = new ObjectPool(Point, 20); trace(pool); trace("---------"); for (var i:int = 0, p:Point; i < 40; i++) { p = pool.getObject(); p.x = Math.random() * 400; if (p.x > 300) pool.releaseObject(p); trace(pool.toString()); } 1. зачем добавлять в начало когда можно добавлять в конец 2. проверки на in_use нету 3. зачем держать в списке используемые объекты, это имело бы смысл на языках с ручным управлением памяти 4. в списке могут оказаться две ссылки на один и тот же объект если делать releaseObject не в том порядке котором делался getObject рекомендую использовать упрощенную прозрачную реализацию без всей этой шелухи var pool:Vector.<Point> = new Vector.<Point>(); var point:Point = pool.length > 0 ? pool.pop() : new Point(); //getObject pool.push(point); //releaseObject var pool:Vector.<Point> = new Vector.<Point>(20); for (var i:int = 0; i < pool.length; i++) pool[i] = new Point(); trace("---------"); for (var i:int = 0, p:Point; i < 40; i++) { p = pool.length > 0 ? pool.pop() : new Point(); p.x = Math.random() * 400; if (p.x > 300) pool.push(p); trace("Pool " + pool.length); } Примитивные типы есть (как и в js, es) отличаются иммутабельным поведением и хранением на стеке без дополнительной аллокации памяти Последний раз редактировалось Nooob; 31.01.2017 в 00:32. |
|
|||||
Цитата:
С полноценными примитивами, такая конструкция не прокатит без обертки А в AS3 запросто Цитата:
В доках как раз написано, что память для них выделяется даже без присвоения значения http://help.adobe.com/en_US/as3/mobi...7189-7fff.html
__________________
Ко мне можно и нужно обращаться на ты) |
|
|||||
Регистрация: Mar 2007
Сообщений: 319
|
Под хранением на стеке, я имею ввиду то что вне зависимости от того сколько раз был вызван конструктор у простого типа, память в куче под него не выделяется, так как она уже была выделена на стеке и в константном пуле
var classes:Vector.<Class> = new <Class>[Array, Object, Dictionary, int, uint, Number, String, Boolean]; for each (var cls:Class in classes) { var memory:int = System.totalMemory; for(var i:int = 0; i < 100000; i++) { var j:Object = new cls(); } trace(cls, System.totalMemory - memory); System.gc(); } /* [class Array] 151552 [class Object] 12288 [class Dictionary] 548864 [class int] 0 [class uint] 0 [class Number] 0 [class String] 0 [class Boolean] 0 значения не показательные, лучше смотреть в Scout */ Добавлено через 5 часов 26 минут Цитата:
C# void doSomething(Object obj) { int resultVar = (int)obj; } int someVar = 1; print(someVar is Object); //True doSomething(someVar); хотя наследником он быть не может Последний раз редактировалось Nooob; 31.01.2017 в 23:51. |
Часовой пояс GMT +4, время: 14:02. |
|
« Предыдущая тема | Следующая тема » |
Опции темы | |
Опции просмотра | |
|
|