Шаблон с одними и теми же аргументами в разных единицах трансляции?
От: pkl  
Дата: 13.03.13 10:04
Оценка:
Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
От: rusted Беларусь  
Дата: 13.03.13 10:23
Оценка: 1 (1)
Здравствуйте, pkl, Вы писали:

pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?


Потому что линкер учитывает, что такое может быть. И шаблоны тут не уникальны, inline функции, которые не могут быть встроены тоже дублируются в разных объектных файлах.
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
От: LaptevVV Россия  
Дата: 13.03.13 10:29
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?

А ты при инстанцировании объекты тоже одинаково называл?
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
От: Alexéy Sudachén Чили  
Дата: 13.03.13 13:08
Оценка:
pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах. Линкер ведь должен ругаться, но на практике такое использование шаблонов встречается часто. Почему это работает?

inline int f() { return 0; }
template<int q> int F() { return q; }

int main() {
  return f() + F<0>();
}


cl -c 1.cpp
dumpbin /headers 1.obj

SECTION HEADER #4
   .text name
       0 physical address
       0 virtual address
       7 size of raw data
     198 file pointer to raw data (00000198 to 0000019E)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60501020 flags
         Code
         COMDAT; sym= "int __cdecl f(void)" (?f@@YAHXZ)
         16 byte align
         Execute Read

SECTION HEADER #5
   .text name
       0 physical address
       0 virtual address
       7 size of raw data
     19F file pointer to raw data (0000019F to 000001A5)
       0 file pointer to relocation table
       0 file pointer to line numbers
       0 number of relocations
       0 number of line numbers
60501020 flags
         Code
         COMDAT; sym= "int __cdecl F<0>(void)" (??$F@$0A@@@YAHXZ)
         16 byte align
         Execute Read


то что выделено — инструкция линкеру, что это разделяемые символы.
Re: Шаблон с одними и теми же аргументами в разных единицах трансляции?
От: Панда Россия  
Дата: 13.03.13 13:58
Оценка:
Здравствуйте, pkl, Вы писали:

pkl>Если шаблон класса с методами, объявленный и определённый в файле .h, инстанциирован с одними и теми же аргументами шаблона в разных единицах трансляции, то я получу одни и те же символы в разных объектных файлах.


Эти символы в объектных файлах помечаются как "слабые". Линкер, если видит дубликаты слабых символов, не считает это ошибкой и считает, что может использовать любой из них, а остальные выкинуть.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.