Войти
ПрограммированиеФорумОбщее

Простая реализация RTTI (run time type information) (комментарии) (2 стр)

Страницы: 1 2 3 4 Следующая »
#15
13:00, 30 дек. 2009

opengl_extensions
> в дебаг сборке на 1000000 итераций отношение dynamic_cast / костыль с
> блэкджеком - 0.01 [ 12.82M / 0.14M ]

в дебаг сборке будет медленнее, это естественно, по идее на скорость dynamic_cast дебаг не особо влияет.


#16
13:05, 30 дек. 2009

Visual Studio 2005 version 8.0.50727.762 собрано в Release с /O2

WinXP SP3 ,  Intel(R) Pentium(R) D CPU 2.80 GHz , 1 GB RAM DDR2 Dual 333,4 Mhz (PC2-5300)

отношение  ~ 0.73

в дебаге то ясно ) да и такое количество привидений типов = гадкая проектировка

да еще у тебя foo 6 раз - у меня 8

#17
13:09, 30 дек. 2009

А в чём профит по сравнению обычного стандартного RTTI? Зачем свой изобретать?

ud1
Стать участником ИМХО настолько просто, что только ленивые не участники... :)

#18
21:36, 30 дек. 2009

Executor
> А в чём профит по сравнению обычного стандартного RTTI? Зачем свой изобретать?

Профит в следующем:

1.Умеет больше чем стандартный - можно автоматическую сериализацию привинтить поверх или редактор свойств класса визуальный или автосинхронизацию состояния классов по сети...
2.Т.к. умеет больше, можно по текстовому имени класса создавать экземпляры объектов
3.Переносимый, работает на любом компиляторе/платформе

#19
21:42, 30 дек. 2009

opengl_extensions
> Visual Studio 2005 version 8.0.50727.762 собрано в Release с /O2
>
> WinXP SP3 , Intel(R) Pentium(R) D CPU 2.80 GHz , 1 GB RAM DDR2 Dual 333,4 Mhz
> (PC2-5300)
>
> отношение ~ 0.73

Потестил в конторе сегодня. На AMD с длинными именами классов, прирост стабильно 1.5-1.7 . На интелах, наоборот начинает медленнее работать.
После праздников посмотрю почему. По идее должно все быть очень быстро (compile time хеши строк, минимум проверок и т.д.)
Быстрее только вынимать rtti информацию из pdb после компиляции, как к примеру вот тут делают (Часть 1, Часть 2, Часть 3)

#20
2:54, 31 дек. 2009

Sergey Makeev
> static RS_INLINE void StringHashCompiletime::Build(unsigned int & hash, int strLen, const char * input)
беда в том, что это не чистый компайл-тайм. при определенных условиях компилер может выдать честный рантаймовый код.
но вроде для хешей задача решаема, надо будет попробовать.
ЗЫ для чистого компайл-тайма нужны компайл-таймовые строки.

#21
3:59, 31 дек. 2009

сравните и мою реализацию... http://www.gamedev.ru/code/tip/?id=4696

#22
7:24, 31 дек. 2009

2Pushkoff
оч похоже на класическое. так же у себя (MyGUI) реализовал (тайпдифами) макрос, где не нужно указывать отца. т.е. в твоем случае будет выглядеть вот так.

class Object
{
public:
  DECLARE_ROOT_OBJECT(Object)
 
};

class ChildObject : public Object
{
public:
  DECLARE_OBJECT(ChildObject)
};

class SecondChildObject : public ChildObject
{
public:
  DECLARE_OBJECT(SecondChildObject)
};

#23
12:43, 31 дек. 2009

San
> беда в том, что это не чистый компайл-тайм. при определенных условиях компилер
> может выдать честный рантаймовый код.

Проверял на VS2005 и GCC 4.4.2 оптимизатор там умный, сворачивает все до констант. А так, да - это не чистый compile time, а весь рассчет на умный оптимизатор.
Интереснее почему на AMD и Intel разница - это в новом году уже проверю :) заодно и тесты для X360 а попозже и для PS3 сделаю.

#24
13:06, 31 дек. 2009

my.name
ну это если компилятор поддерживает __super (MSVC) или что-то подобное...

#25
14:04, 31 дек. 2009

Pushkoff
> ну это если компилятор поддерживает __super (MSVC) или что-то подобное...
нет =) все гораздо проще и переносимо

в книге эволюция C++ был такой пример, кто то предложил ввести в стандарт ключевое слово base (как в некоторых языках) которое является синонимом типа базового класа, если он один.
и чуть было не ввели, но ктото вовремя догадался что это мона сделать одной строкой:
typedef BaseClass base;

соответсвено реализация простая
в твоем макросе ROOT ты делаешь еще дефан.
typedef cls RTTIBase;

а в макросе дочернего класа пишешь такое:
typedef RTTIBase Base;
typedef cls RTTIBase;

вуаля, теперь мона в макросе не указывать твой super и внутри дочерних класов доступен тип Base
мне это помогло пару раз, когда менял иерархию, оказалось внутри класа вызывал бызовые методы старого отца. после того как везде поменял на Base::имя_метода то таких проблем больше небыло

#26
14:06, 31 дек. 2009

my.name
а вот это стоило оформить как подсказку...

#27
14:11, 31 дек. 2009

Pushkoff
> а вот это стоило оформить как подсказку...
оформи =)

#28
15:35, 31 дек. 2009

my.name
ну это как бе твой велосипед... у меня своих велосипедов хватает...

#29
20:15, 31 дек. 2009

ну ок, давай тогда просто сделаем, если ты заюзаешь, то от своего имени и оформишь подсказку. ты же не ленишься выкладывать свой вариант RTTI . я думаю это честно =)

Страницы: 1 2 3 4 Следующая »
ПрограммированиеФорумОбщее

Тема в архиве.