Re[17]: А правда, расскажи а?
От: Erop Россия  
Дата: 08.04.11 19:11
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>Можно, конечно, в display просто enum хранить. Но тогда придётся делать по нему switch в каждой интересующей функции. А это не только почти наверняка медленнее виртуальных методов, но и неправильно методологически.


Да нет, я имел в виду не это. Насколько я понимаю большая часть всех этих виртуальных функций тривиальная. Можно просто сразу их результаты пересчитывать и в элементе кэшировать. Может получиться быстрее, однако.

MOP>Ну да, реализация таблицы виртуальных методов на чистом C. Вот как выше для COM, только без хака. Честное и эффективное решение.


Ну, например. Только я бы ещё постарался избавится от части виртуальных функций.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[12]: А правда, расскажи а?
От: SleepyDrago Украина  
Дата: 09.04.11 11:50
Оценка: 19 (1)
Здравствуйте, c-smile, Вы писали:

...
CS>Есть такой вариант:

CS>
CS>static handler* pA = new handler_A();
CS>static handler* pB = new handler_B();

CS>class element
CS>{
CS>  handler* ph;
CS>  void layout_width(...) { ph->do_layout_width(this, ...); }
CS>  void layout_height(...) { ph->do_layout_height(this, ...); }

CS>  void specialize(type) { 
CS>                        switch(type) {
CS>                          case tA : ph = pA; break;   
CS>                          case tB : ph = pB; break;  }
CS>                        } 
CS>};
CS>


CS>Функционально вышесказанное есть:


CS>
CS>class element
CS>{
CS>  void layout_width(...) {}
CS>  void layout_height(...) {}

CS>  void specialize(type) { 
CS>                        switch(type) {
CS>                          turn_to<elementA>(this); break;   
CS>                          turn_to<elementB>(this); break; }
CS>                        } 
CS>};

CS>class elementA:element
CS>{
CS>  void layout_width(...) {...} // имплементация/специализация
CS>  void layout_height(...) {...} // имплементация/специализация
CS>};

CS>class elementB:element
CS>{
CS>  void layout_width(...) {...} // имплементация/специализация
CS>  void layout_height(...) {...} // имплементация/специализация
CS>};
CS>


CS>Что мы получаем в этом случае:

CS>1) нет поля handler* ph; меньше памяти нужно на instance
CS>2) нет дополнительной косвенности вызова.
CS>3) количество параметров вызова требуемое ph->do_layout_*** меньше на единицу...

CS>Поле handler* ph; в первом примере дублирует функционально VTBL в виде самописного лисапета.

CS>А собственно зачем его дублировать когда оно есть и так?
...
Вам стоит дописать в кодстайл запрет на использование ссылок в "элементах".
Пруф Вкратце есть огромная серая зона в стандарте, которая напрочь игнорирует существующие техники. Даже если бы вы удаляли элемент и создавали нового типа, но выделение дергали из пула то компилятор может не перепривязать ссылку. Что можно сказать ? Стандарты писать тяжело наверное и ошибки на том уровне ловить тем более.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.