Это зависит от реализации.
Некоторые компиляторы будут генерировать одни и те же экземпляры шаблона снова и снова для каждой единицы перевода, в которой они созданы, и позволить компоновщику сворачивать дубликаты.
Шаблоны получили плохую репутацию «раздувания кода», когда компоновщики еще не выполнили эту задачу. В настоящее время это, вероятно, незаслуженно. Некоторые реализации даже сворачивают разные экземпляры, когда они компилируются в один и тот же целевой машинный код. (Подобно f<A*>()
и f<B*>()
, поскольку типы указателей - это просто адреса в сгенерированном машинном коде.)
Другие будут откладывать компиляцию шаблонов до времени компоновки, и могут быть другие способы справиться с этим. Как я уже сказал, дело за реализацией.
Все они имеют различные преимущества и недостатки. В отсутствие истинной модульной концепции, я сомневаюсь, что кто-нибудь придумает идеальную схему.
С export
требовалось, чтобы компиляторы предварительно компилировали код шаблона и создавали его по запросу. Однако, за исключением одного поставщика, никто не реализовал export
для своего компилятора, и теперь он удален.