Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 29.01.2017, 14:36
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 11  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
если тип возвращаемого объект я присвою заранее то и не нужно приведение ?
Да. Но ты и в первом случае можешь не делать приведение к типу, это не будет грубой ошибкой, так как всё в as3 унаследовано от Object, даже "примитивные" типы (которых в as3 на самом деле нет) вроде Number или Boolean. Но вот если у тебя там будет возвращаться не Object, а какой-нибудь кастомный класс, и тебе нужно будет привести к его наследнику, тогда приведение будет необходимо (хотя, возможно, не на всех компиляторах)
__________________
Ко мне можно и нужно обращаться на ты)

Старый 30.01.2017, 23:29
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 12  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
для неизвестного типа есть обобщенный тип *, без кастов передача ссылки, это будет лучше чем Object в данном случае
Код AS3:
	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;
		}
	}
Код AS3:
			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());
			}
странная реализация ObjectPool
1. зачем добавлять в начало когда можно добавлять в конец
2. проверки на in_use нету
3. зачем держать в списке используемые объекты, это имело бы смысл на языках с ручным управлением памяти
4. в списке могут оказаться две ссылки на один и тот же объект если делать releaseObject не в том порядке котором делался getObject

рекомендую использовать упрощенную прозрачную реализацию без всей этой шелухи
Код AS3:
var pool:Vector.<Point> = new Vector.<Point>();
 
var point:Point = pool.length > 0 ? pool.pop() : new Point(); //getObject
pool.push(point); //releaseObject
Код AS3:
			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);
			}
Добавлено через 31 минуту
Цитата:
Сообщение от caseyryan Посмотреть сообщение
"примитивные" типы (которых в as3 на самом деле нет) вроде Number или Boolean
Примитивные типы есть (как и в js, es) отличаются иммутабельным поведением и хранением на стеке без дополнительной аллокации памяти


Последний раз редактировалось Nooob; 31.01.2017 в 00:32.
Старый 31.01.2017, 06:45
caseyryan вне форума Посмотреть профиль Отправить личное сообщение для caseyryan Найти все сообщения от caseyryan
  № 13  
Ответить с цитированием
caseyryan
 
Аватар для caseyryan

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
Цитата:
Сообщение от Nooob Посмотреть сообщение
Примитивные типы есть (как и в js, es) отличаются иммутабельным поведением и хранением на стеке без дополнительной аллокации памяти
Во многих других языках примитивы "настоящие", не унаследованы от Object. Поэтому назвать их полноценными примитивами здесь, никак нельзя.
С полноценными примитивами, такая конструкция не прокатит без обертки
Код AS3:
void doSomething(Object obj) {
 
}
int someVar = 1;
doSomething(someVar);
А в AS3 запросто
Цитата:
хранением на стеке без дополнительной аллокации памяти
Откуда инфа про стек в as3?
В доках как раз написано, что память для них выделяется даже без присвоения значения http://help.adobe.com/en_US/as3/mobi...7189-7fff.html
__________________
Ко мне можно и нужно обращаться на ты)

Старый 31.01.2017, 17:28
Nooob вне форума Посмотреть профиль Отправить личное сообщение для Nooob Найти все сообщения от Nooob
  № 14  
Ответить с цитированием
Nooob
 
Аватар для Nooob

Регистрация: Mar 2007
Сообщений: 319
Под хранением на стеке, я имею ввиду то что вне зависимости от того сколько раз был вызван конструктор у простого типа, память в куче под него не выделяется, так как она уже была выделена на стеке и в константном пуле
Код AS3:
			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
*/
это можно понять по спецификации AVM2

Добавлено через 5 часов 26 минут
Цитата:
Сообщение от caseyryan Посмотреть сообщение
Во многих других языках примитивы "настоящие", не унаследованы от Object. Поэтому назвать их полноценными примитивами здесь, никак нельзя.
С полноценными примитивами, такая конструкция не прокатит без обертки
Во многих других языках так же есть возможность boxing/unboxing примитивных типов в базовый тип и складывается впечатление что все примитивные типы наследники Object.

C#
Код:
void doSomething(Object obj)
{
        int resultVar = (int)obj;
}
int someVar = 1;
print(someVar is Object); //True
doSomething(someVar);
Тоже самое что кажется что int наследник Number,
Код AS3:
var a:int = 1;
trace (a is Number); //true
хотя наследником он быть не может


Последний раз редактировалось Nooob; 31.01.2017 в 23:51.
Создать новую тему Ответ Часовой пояс GMT +4, время: 21:05.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 21:05.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.