|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
Подстановка типа\шаблоны с++14.05.2015, 17:21. Показов 4682. Ответов 38
Метки нет (Все метки)
Добрый день, не могу разобраться
представим есть классец находится в .h
далее, есть предположим 2-3 .cpp файла, который тянут этот хедер с этим классом в каждом .срр создается объект этого класса, причем в качестве шаблонного параметр всегда одно значение, пусть enum1 сколько раз происходит подстановка этого типа? если несколько раз, то можно ли ускорить сборку? т.е сделать как то чтобы подстановка производилась 1 раз
0
|
||||||
| 14.05.2015, 17:21 | |
|
Ответы с готовыми решениями:
38
Подстановка вычисляемого типа в шаблонах Шаблоны изменение типа
|
|
196 / 197 / 120
Регистрация: 27.05.2011
Сообщений: 545
|
|
| 14.05.2015, 18:39 | |
|
В каждой единице трансляции просходит инстанцирование шаблона, однако, если параметр одинаковый, то и тип тоже будет одинаковый.
Чтобы ускорить компиляцию, можно использовать предкомпилированные заголовки. Тут уж читайте докуентацию к своему компилятору. Например, gcc, когда встречает директиву #include, ищет вначале файл с расширением *.gch, если он его находит, то использует его. Иначе используется файл, как указано в директиве
1
|
|
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||||||||
| 14.05.2015, 19:01 | |||||||||||||
|
Но компиляторы нынче умные. Умеют сами это распознавать и не генерят лишнего. По крайней мере на этапе линковки все лишние инстанции выкидываются. Хотя раньше это было причиной нападок на шаблоны С++, мол раздувают код. Суть приема в следующем: Делаешь свой h-ник в таком виде:
Теперь допустим у нас есть три файла, в которых наш заголовочный файл подключается. В одном из этих файлов произведем явное инстанцирование:
Далее можно пользоваться шаблоном как обычно. ___ Но. Я не рекомендую злоупотреблять данной техникой. Даже может быть когда она может дать прирост в скорости компиляции. Т.к. необходимость ручного контроля инстанций приведет к снижению общей сопровождаемости кода. И компиляторы сейчас довольно шустрые, гораздо быстрее чем были раньше.
5
|
|||||||||||||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||||||||
| 15.05.2015, 10:01 [ТС] | ||||||||||||
![]() Добавлено через 4 минуты я попробовал такую вещь, но наверное сам не до конца понял как оно работает .h - с шаблонным классом несколько .cpp где юзается указатель на шаблонный класс(в таком случае происходит подстановка типа?) есть еще .h где есть метод(только объявлен, метод так же шаблонный), который возвращает каждый раз новый указатель на шаблонный класс типо того
0
|
||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 15.05.2015, 10:47 | ||
|
Как вариант, если твой код позволяет это сделать, то почему бы и нет. Просто такое не всегда возможно. В принципе, централизованый подход для сокращения времени компиляции - использование предкомпилированных заголовков. см. первый ответ в теме.
0
|
||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||
| 15.05.2015, 11:13 [ТС] | ||
![]() так что произошло с подстановкой типа в классе MyClass ? один раз подставилось или в каждой единице трансляции (наверное забыл сказать что теперь в каждый .cpp подключаем .h где есть метод getNewInstatnce и дергаем его)
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||||||
| 15.05.2015, 11:23 | |||||||
|
Т.е. твой код жестко приколочен к одной специализации. Если T будет отличным от enum1 (кстати почему typename, был же enum?), то будет ошибка линковки. Вероятно корректнее будет сделать так (чтобы не ломалось для сотальных T):
0
|
|||||||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||
| 15.05.2015, 11:27 [ТС] | ||
|
все таки почему подставляется один раз то? я честно не понял мы же .cpp файлах юзаем указатель на класс конкретно инстанциированный определенным типом, подстановка для класса будет в этих .срр или нет, а если нет то почему?
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 15.05.2015, 11:36 | ||
|
У тебя либо нет других аргументов кроме enum1, либо где-то все-таки есть инстанции для остальных аргументов, либо ты привел неполный код. Тут столько вариантов, что приводя некорректные или неполные примеры можно кардинально разный ответ получить.
1
|
||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||||||||||||||||||||||||||
| 15.05.2015, 12:15 [ТС] | |||||||||||||||||||||||||||||||
0
|
|||||||||||||||||||||||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|
| 15.05.2015, 12:42 | |
|
aLarman, ну вот. Видишь же, кроме enum1 нет других параметров.
Добавь использование для enum2, и увидишь ошибку. Поэтому перепиши заголовочник как в посте 7. У тебя вопросы еще остались, ели все понятно?
0
|
|
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||
| 15.05.2015, 12:47 [ТС] | |||
|
и собсно вопросы, 1)почему если сделать так как написано в 10ом посте, то время компиляции сокращается(точнее за счет чего) 2) подстановка типа для класса MyClass будет так же производиться в каждом .cpp фале или только один раз в Instance.cpp
0
|
|||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 15.05.2015, 12:50 | |||
|
1
|
|||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||
| 15.05.2015, 12:53 [ТС] | ||
|
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 15.05.2015, 12:55 | ||
|
Сейчас ты убрал тело, поэтому инстанцирования не будет вообще. Вроде бы все понятно, нет?
0
|
||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
|||||||||||
| 15.05.2015, 13:03 [ТС] | |||||||||||
|
DrOffset, я сам просто больше запутался, вот и Вас запутываю похоже
есть 2 варинта - 1ый как в заголовке, т.е каждый .cpp тянет .h, в каждом .cpp есть указатель на
так вот, есть 2ой вариант(код в 10ом посте) и написать в каждом .cpp
0
|
|||||||||||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
|||
| 15.05.2015, 13:11 | |||
![]() Я же уже отвечал на этот вопрос несколько раз ![]() Инстанцирования не будет вообще! Потому что ты убрал тело шаблона. Ты добавил специализацию для enum1, эта специализация - теперь не шаблон, а обычная функция. В других файлах будет подстановка аргумента и генерация имени функции с учетом этого. Т.к. тела шаблона нет, то компилятор никакого кода больше не генерирует, а вставляет ссылку для линкера, мол, вот такая-то функция, где-то есть. Потом, когда линкер производит связывание, он находит определение этого имени в виде твоей специализации. Все.
1
|
|||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||
| 15.05.2015, 13:45 [ТС] | ||
|
еще маленький момЭнт, а указатель же присутствует, для него не будет инстанциирования? по большому счету что выходит, 1ый варинат new в каждом .срр, 2ой варинат - в одном
0
|
||
|
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
|
||
| 15.05.2015, 13:49 | ||
Сообщение было отмечено aLarman как решение
РешениеНо по другой причине, потому что для определения указателя необязательно полное определение класса иметь. Компилятор инстанцирует лениво, поэтому инстанцирование для класса будет там, где был вызван new.
1
|
||
|
654 / 575 / 164
Регистрация: 13.12.2012
Сообщений: 2,124
|
||||||
| 15.05.2015, 13:53 [ТС] | ||||||
|
кажется это то что я хотел услышать!!!спасибо!!!
Добавлено через 1 минуту во вдогоночку раз такая пьянка
0
|
||||||
| 15.05.2015, 13:53 | |
|
Помогаю со студенческими работами здесь
20
Шаблоны. Ошибка приведения типа Шаблоны, наследование и размер типа Подстановка в выражение типа string
Подстановка, зависимые ячейки, подстановка по условию Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога
Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536
Одним из. . .
|
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
|
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
|
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
|
|
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога
Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
|
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование
. \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json>
Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом.
# Check if. . .
|
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так:
https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347
Основана на STM32F303RBT6.
На борту пять. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|