![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
с чего ты это взял? будут точно так-же созданы N реализаций шаблона |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Иногда стоит - если ты эту функцию объявил, но не используешь в данном проекте, то она не будет включена в исполняемый файл. А если функция обычная, то она будет всегда включена в исполняемый файл, даже если не нужна (если файл с функцией исключить нельзя, поскольку в нём есть нужные функции и он используется в другом проекте, где все функции нужны) |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
||||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
Я сказал: основной код шаблона не размножается. Большинство методов будет взято из базового класса или будут inline-методами, вызывающими метод базового класса с кастингом аргументов и результата. Фактически размножатся только конструктор и деструктор. |
|||
|
||||
| Alca |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 7 Всего: 50 |
Она же не будет включена в исполняемый файл. |
|||
|
||||
| zim22 |
|
||||||||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
Из книжечки "Программирование на С++". Коплиен
main.cpp
List.h
Set.h
Это сообщение отредактировал(а) zim22 - 27.5.2009, 10:20 |
||||||||
|
|||||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Есть и минусы, шаблон это общее решение. Общее решение всегда не быстрее грамотного частного решения. Шаблон должен использовать только общие возможности всех типов для которых он предназначен, тогда как специальный класс может использовать все возможности того типа с которым он работает.
Для сравнения создайте вектор, например из 1024 байтов и добавьте еще элемент так чтобы было перераспределение и сделайте аналогичные операции руками при помощи new для выделения памяти/memcpy для копирования элементов/memset для инициализации нулями. Думаю скорость будет выше раза в два. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| ilyuha |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 111 Регистрация: 10.7.2007 Репутация: нет Всего: нет |
||||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
бессовестная ложь |
|||
|
||||
| Cтpaнник |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 53 Регистрация: 12.10.2008 Где: Россия, Санкт-Пет ербург Репутация: нет Всего: нет |
Это верно. Однако, не следует преждевременно оптимизировать - во всяком случае, раньше, чем профилировщик и/или пользователи не обратили ваше внимание на низкую производительность. Готовый шаблон из STL нужно - только использовать. Собственный вектор - нужно сначала написать, потом отладить, убедиться в отсутствии ошибок (написать юнит-тесты хотя бы), и только потом - использовать. Скорость разработки зачастую является более значимым фактором, чем потеря 1-2% производительности приложения в целом, которых никто не заметит. Это сообщение отредактировал(а) Cтpaнник - 27.5.2009, 10:27 |
|||
|
||||
| azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
с это чего вдруг? |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
после инстанциирования, алгоритм работы вектора сведется к тому, что квалифицированный программист может написать вручную, лишних действий там выполняться не будет
для некоторых параметров многие шаблоны специализированы, к примеру специализация std:swap для векторов не копирует элементы, а просто меняет местами указатели, или vector<bool> на самом деле не вектор элементов типа bool Добавлено через 3 минуты и 4 секунды
можно специализировать шаблонный класс для определенных типов и оптимизировать некоторые аспекты его работы, а для других типов использовать обобщенную реализацию Добавлено через 11 минут и 26 секунд нет! Alexis - не понимает о чем он говорит, его представление о шаблонах заканчивается на параметризированых типах, a-la дженерики в .NET. С помощью шаблонов можно делать намного больше и не платить за это уменьшением производительности. Некоторые идиомы с++ вообще не реализуемы без шаблонов. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Проведите исследование, зайдите под дебагом в код. При копировании байтиков что будет делать вектор? Использовать 8 бит своего регистра, предварительно очищать верхнюю часть регистра, короче будет порядка 4-5 ассемблерных операций на перенос всего одного байта, тогда как memcpy возьмет цельный регистр разрядности процессора закинет в него сразу 4 элемента (8 элементов) и за одну операцию перекинет его в другой участок памяти. А если глянуть на код наращивания так вообще диву даешься. В том то и дело, что счет идет не на 1-2%, а на 100-200%
Этим мало кто занимается, потому что в тот момент когда пишешь шаблон как правило не знаешь всех типов к которым он будет применим. Начинаешь проектировать общее. В последствии менять код шаблона уже не желательно, так как это может повлиять на стабильность его работы. Кроме того шаблонный код ориентирован максимально на статическое связывание внутри программы, это уменьшает гибкость в рантайме, ухудшают модульность, увеличивают время компиляции. Попробуйте экспортировать шаблон из DLL. При каждой перекомпиляции модуля будут перекомпилированы все шаблоны которые он использует, не просто заголовки, а их реализация. Можно сказать что шаблонный класс это недокласс. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Опять-же, бессовестная ложь Посмотри что получится в релизе, с оптимизациями и отключенными runtime проверками. И чем тебе не нравится код наращивания?
я привел пример |
|||
|
||||
| azesmcar |
|
||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 81 Всего: 211 |
непременно проведу..но вы сперва скажите какая из реализаций СТЛ ведет себя так а то я подозреваю что на нее наткнутся будет весьма сложно.
покажите мне в стандарте - где сказано что вектор должен копировать используя
и
это дело того - кто реализовывал СТЛ. Стандарт не требует вызывать копи-конструкторы во время наращивания вектора, следовательно можно реализовать это и с помощью memcpy. |
||||||
|
|||||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |