- Что означает избыточные экземпляры шаблона здесь?
Предположим, у нас есть template <typename T> class A {};
, который объявлен вa.hpp
.У нас есть два способа создания объекта в a.cpp
:
1.явное создание экземпляра
- явное определение экземпляра:
template class A <type>;
- явное объявление создания:
extern template class A <type>;
2.неявная реализация
Когда код ссылается на шаблон в контексте, который требует полностью определенного типа, или когда полнота типа влияет на код и этот конкретный тип не был явно создан , происходит неявное создание
Когда TU не могут найти определение или объявление явного создания экземпляра, t A<int> a;
будетвызвать неявную реализацию.
разница между специализацией и экземпляром
Давайте вернемся к вопросу: Что означают избыточные экземпляры шаблона здесь?
Я разделю его на несколько случаев в рамках одного a.cpp
:
Случай 1 ---- неявная реализация
#include "a.h"
A<int> a;
=>
class A<int>
{
};
A<int> a;
Случай 2 ---- неявная реализация
#include "a..h"
A<int> a;
A<int> b;
=>
class A<int>
{
};
A<int> a;
A<int> b;
Случай 3 ---- Явное определение реализации:
#include "a.h"
template class A<int>;
A<int> a;
=>
#include "a.h"
template class A<int>;
A<int> a;
Вывод:
- Неявная реализация будет создавать избыточные экземпляры шаблона, в то время как явное определение / объявление не будет.
- Компоновщик удалит такие избыточные экземпляры шаблона, но он увеличится
link-time
.
Если вам интересно, как работает компоновщик для удаления избыточных экземпляров шаблона, прочтитеэтот поток: Как компоновщик обрабатывает идентичные экземпляры шаблона в единицах перевода?