![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
У шаблонов есть эффект "раздувания" кода, часто его можно свести к минимуму специальным подходом в каждом случае. Интересует решение следующей проблемы:
Создает ли реальный компилятор по одному телу функции func() при каждом инстанциировании или все-же видит что зависимости от параметра T нету и делает одну? Если создает несколько тел, то как можно обойти это "раздувание" (интересуют эффективные методы, без множественного виртуального наследования и введения дополнительного уровня косвенности)? Это сообщение отредактировал(а) georain - 19.2.2009, 16:25 |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
А лучше не думать об этом и доверится умному алгоритму мерджинга компилятора для таких случаев. Он лучше сделат это чем вы |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
ф-я, неявно, получает в качестве первого параметра указатель на экземпляр объекта, тип объекта будет отличаться при разных параметрах шаблона, соответственно это будут разные типы функций, даже если у них будет одинаковое тело...
но вообще соглашусь:
|
|||
|
||||
| W4FhLF |
|
|||
![]() found myself ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2831 Регистрация: 2.12.2006 Репутация: 20 Всего: 121 |
Зависимость, или её отсутствие, от T недостаточное условие. Как минимум ещё должна отсутствовать зависимость от данных самого класса Derived. Это сообщение отредактировал(а) W4FhLF - 1.8.2008, 15:45 -------------------- "Бог умер" © Ницше "Ницше умер" © Бог |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Подумать насчет критичности. Если не очень, то не париться. Если есть подозрение, что критично, или очень душит жаба, или... то вынести общий код в нешаблонный базовый класс... работы не много, архитектура не сильно страдает, жаба успокаивается.
-------------------- ... |
|||
|
||||
| warmonger_ |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 155 Регистрация: 7.7.2007 Где: г. Киев Репутация: 1 Всего: 3 |
--------------------
Make everything as simple as possible, but not simpler.Albert Einstein |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Тогда если функция в базовом нешаблонном класс inline, то получится тоже самое раздувание, а если не inline, то получится двойной вызов (функция то virtual, её не встроить). В этом суть проблемы Добавлено через 7 минут и 44 секунды Теоретически в машинном коде можно сделать чтобы в шаблоне была общая виртуальная функция (например указатель на одну и туже функцию в виртуальных таблицах), но как это написать на c++ никак не соображу. Вопрос этот возник при объединении стратегий и полиморфных иерархий. (P.S. Пишу код критичный ко времени выполнения и размеру) |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
а бывает еше и третий случай? а то что Вы пытаетесь сейчас объяснить не будет ли двойным вызовом ? а вот виртуальный вызов всегда медленее чем обычный Добавлено через 13 минут и 46 секунд не это ли имелoсь ввиду при упоминании о виртуальной функции шаблона ? http://www.insidecpp.ru/patterns/curiously...mplate_pattern/ Это сообщение отредактировал(а) mes - 4.8.2008, 21:53 |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
1) inline 2) не inline 3) другое архитектурное решение нет, это будет вызов виртуальной функции, а не вызов функции из виртуальной функции Спасибо!
Нет, к сожалению не это. CRTP позволяет использовать функциональность дочерних классов, а здесь необходимо иметь вызов одной виртуальной функции для семейства шаблонов. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
1 inline - кусок кода подставляется 2. не inline - кусок кода выделен как функция 3. другое архитектурное решение - это как ?!
если так, то ив том случае будет просто вызов внешней функции, а не двойной нельзя ли подробней , что Вы тут имели ввиду.. ? Добавлено @ 23:44 "семейство шаблонов" ? интересно как Вы себе это представляете.. Если подразумеваете набор классов полученных из одного шаблона - то тогда скорей всего Вы не правильно представляете суть шаблона. Шаблон это всего лишь макроподстановка ( хоть и облагороженная, и выведенная на новую ступень эволюции.. ) Это сообщение отредактировал(а) mes - 5.8.2008, 23:45 |
|||
|
||||
| georain |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 193 Регистрация: 28.11.2006 Где: Санкт-Петербург Репутация: нет Всего: нет |
Это чтобы не пришлось решать inline тут нужна функция или не inline, для решения проблемы, а сделать вызов нужной функции в нужном месте, и решать inline или не inline в зависимости от её размера и к-ва точек вызова. Примером будет решение данного топика, если оно есть.
в том? в каком? То что написано в первом посте, пример и вопрос "как можно обойти "раздувание" без множественного виртуального наследования и введения дополнительного уровня косвенности?" Шаблоны - это революция в программировании. Сначала было структурное программирование, потом стало объектно-ориентированное, добавился динамический полиморфизм, потом появилось обобщённое программирование, добавился статический полиморфизм, появилось метапрограммирование, а после ещё очень очень много всего. "Что нового можно сказать о языке C++? Оказывается очень много." Из предисловия к Современное проектирование на С++. Андрей Александреску. А макроподстановка как была макроподстановкой из языка "с", так ей и остаётся. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
именно это делает директива inline. Если она указана, то совсем не значит, что функция будет подставлена. Это всего лишь указание/подсказка для компилятора с линкером.. в том где происходит вызов внешей функции.. например если вашу "витуальную " функцию заменить на обычную внешнюю а чем виртуальная функция не дополнительный уровень косвенности ? плюс к тому же виртуальная функция эта такая функция которая у каждого класса имеет свою реализацию Вы же, насколько это следует из постов, виртуальной называете функцию имеюшую обшую реализацию для разных классов никто не спорит да согласен.. но это видимый результат .. А чем является шаблон по своей сути?
шаблон , предпроцессор #define и внешняя кодогенерация являются разновидностью макроподстановки . |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |