![]() |
|
![]() ![]() ![]() |
|
IOnic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.12.2005 Репутация: нет Всего: нет |
Вопрос: имплементация шаблонных функций (членов классов) в .h файле влечет за собой включение тела функции (а не ссылки на нее) в бинарнике? Если нет, то применимо ли "inline" для того чтобы компилятор включал тело функции-члена шаблонного класа? (среда VS2003) Невероятных размеров спасибо!
|
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
1) Инстационируется только то, что реально вызывается.
2) Все остальное - то же, что для нешаблонных классов, т.е. напишешь inline - будет inline, нет - будет только одно тело где-нибудь (в пределах исполняемого модуля). Если хочешь экспортировать шаблонную функцию из DLL, это надо делать явно. -------------------- ... |
|||
|
||||
Guest |
|
|||
Unregistered |
Earnest
Подскажи, как шаблонную функцию включить в dll ? |
|||
|
||||
IOnic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.12.2005 Репутация: нет Всего: нет |
... насчет этого я в курсе. А вот есть ли разница между имплементацией в .h и в .cpp с точки зрения бинарника? Другими словами, равносильна ли имплементация функции добавлению "inline" к этой функции в .cpp? Пример - stdlib: std::vector, std::pair, и т.д. Там все в .h. Вобщем не только из-за этого есть подозрения. Я видел кучу исходников в которых небольшие шаблонные классы были полностью в .h в отличии от "тяжелых" (те же параметры шаблонов). Так что вопрос остается открытым... |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Шаблонную функцию в DLL не включишь, только ее конкретную реализацию для конкретных параметров.
Извини, видимо, ввела тебя в заблуждение неточной фразой. Имела в виду, что шаблонную функцию для каких-то параметров можно явно инстационировать в каком-то модуле заранее. -------------------- ... |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Разница в том, что тела шаблонных функций, написанные в cpp, недоступны для других частей программы, а, стало быть, бесполезны как общедоступные шаблоны. Конечно, никто не мешает включить cpp файл директивой #include, но мы ведь не об этом говорим? ![]() Реализация шаблонов в cpp-файлах имеет смысл в двух случаях: 1) класс совершенно локальный, и используется ровно в том модуле, где нарисован. 2) шаблоны достаточтно тяжелые для засовывания в Н-файл (например, много связей тянут), но заранее известно, что они будут использоваться только с заданным небольшим числом параметров. Тогда их нужно явно инстационировать для этих параметров.
нет, если функция не имплементирована прямо внутри объявления класса. -------------------- ... |
||||
|
|||||
IOnic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.12.2005 Репутация: нет Всего: нет |
айайай... я чуток загнул
![]() |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Так, я уже не понимаю, чего ты не понимаешь...
![]() -------------------- ... |
|||
|
||||
IOnic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.12.2005 Репутация: нет Всего: нет |
Вот оно! Тоесть, ДА, если мы определяем название функции, типы аргументов, и сразу же за этим пишем тело??? |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
... то это инлайн.
Ну ты и спрашиваешь! ![]() Добавлено @ 21:17 Если, конечно, оно не виртуал... -------------------- ... |
|||
|
||||
IOnic |
|
|||
Новичок Профиль Группа: Участник Сообщений: 5 Регистрация: 13.12.2005 Репутация: нет Всего: нет |
тоесть инлайн не используя кейворд "инлайн". Это меня и интересовало (я не проф. прогаммер, даже на курсы не ходил, и в Страуструпе насчет этого ничего не нашел). Сенкс!
![]() Добавлено @ 21:25
![]() Earnest спасибо! |
|||
|
||||
threef |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
Инлайн функции либо обьявляются inline, либо записываются в тело класса. При этом, если в ней присутствуют циклы, статические переменные, рекурсия, switch или в программе есть применение адреса этой функции, то компилятор не сделает ее inline. Зато может сделать другую, при указании на оптимизацию по скорости и учитывая ограничения выше. inline никак не связаны с шаблонами. Прекомпиляция заголовков снижает затраты на проверку синтаксиса и вставку файлов.
Шаблоны компилируются только для конкретных параметров, поэтому они и "плавают" в заголовочных файлах целиком - шаблон не может быть откомпилирован в виде шаблона и в таком виде помещен в библиотеку. Это, наверное, и есть причина того, что в MS VS удобнее использовать "родные" MFC-классы коллекций, чем коллекции STL. |
|||
|
||||
Earnest |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 87 Всего: 183 |
Это не совсем так. Т.е., конечно, для таблицы виртуальных функций или аргумента-указателя на функцию генерируется "тело", но в местах прямого вызова, если связывание статическое, вполне может быть выполнена inline-подстановка. Так что даже виртуальные функции стоит делать inline (если они короткие): по крайней мере вызов типа base_class::function внутри перекрытого метода будет инлайн.
Вот уж странное заявление. Если кому и удобнее использовать MFC-коллекции, так только в силу привычки и нежелания отказываться от хорошо знакомого. STL-коллекции имеют более естественную семантику (взять хотя бы эти уродские псевдоитераторы MFC GetPrevPos\GetNextPos), они гибче и уж конечно "стандартнее". Это сообщение отредактировал(а) Earnest - 15.12.2005, 08:33 -------------------- ... |
||||
|
|||||
Гость_Medved |
|
|||
Unregistered |
Подскажите чайнику. Пишу программу на Microsoft Visual Studio . NET Professional 2003 :
#include <iostream> int main() { cout << "Hello.\n"; return 0; } Вот какую ошибку он выдает : unable to start debbuging. unable to start programm 'c\documents and settings\...\мои документы\visual studio progects\1\debug\1.exe' |
|||
|
||||
threef |
|
||||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 27.10.2005 Где: Запорожье Репутация: 1 Всего: 10 |
При чем здесь виртуальные функции ? Если обьект "с " будет статическим, то компилер сделает функцию A::next встроенной; как только появляется использование указателя на функцию, будь то статический вызов или через динамический обьект - тело функции обязательно появится. Чем не статический вызов ?
|
||||||
|
|||||||
![]() ![]() ![]() |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Visual C++/MFC/WTL | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |