![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Шаблоны обычно реализуются в заголовочных файлах. Допустим в n файлах используются шаблонный класс vector<int>. Теперь представим ситуацию, билдим каждый модуль отдельно, соответственно создается n *.obj файлов, каждый из которых содержит свою реализацию vector<int>.
Вопрос в том, как в этом случае поступит линкер? Не ужели он продублирует реализацию шаблона vector<int> в каждом из модулей? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
||||
|
||||
| MAKCim |
|
||||||||||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
а почему тогда тут не мержит
? Добавлено через 5 минут и 4 секунды вопрос снят разный биндинг символов -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||||||||
|
|||||||||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Значит он включает первый модуль где встретит vector<int>, а в последующих заменяет вызовы текущего объектного файла, на вызовы из первого. Но тогда получается, что компилятор должен включать в obj файл полную реализацию класса, а не только те функции класса, которые реально используются.
Или опять же, за удаление неиспользуемых функций класса ответственен линкер? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Alexeis, там смысл такой, что в результирующий бинарник помещаются только тот код, который используется.
Кстати, компилятор не создает код для неиспользуемых методов шаблонов. |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
В конечном счете в исполняемом файле нет модулей, там просто сплошной код. Модули остаются на уровне линковки. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Как же линкер тогда собирает класс? Представим себе что 1й модуль использует методы a, b и c из шаблонного класса, 1 модуль использует b, c и d, 3й использует с, d и f и т.д. И все это один и тот же шаблонный класс. Полного откомпилированного экземпляра у него нет. Значит чтобы собрать класс до кучи понадобиться пропарсить все объектные модули и либы, выдрать из всего этого код всех методов, потом править все ссылки... как-то не правдоподобно звучит. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Вообще-то линкер все это и парсит. Если находит что-то используемое, но не определенное, то выдает ошибку. Кстати, на этапе линковки понятия "класс" уже нет. Есть понятие "символ", который ссылается на переменную или функцию. Это сообщение отредактировал(а) bsa - 23.3.2008, 15:36 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 12 Всего: 459 |
Спасибо вопрос исчерпан.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |