Повторяющиеся экземпляры шаблонов С++
Возможно ли, чтобы компилятор дублировал экземпляры одного шаблона в нескольких единицах перевода?
Например, если у вас есть a.cpp, который использует std:vector<int>
внутри функции, и то же самое для b.cpp, существует ли риск иметь два раза std::vector<int>
в конечном двоичном файле?
Ответы
Ответ 1
Как говорит sharptooth, окончательный двоичный файл будет содержать только один экземпляр. Но шаблоны все равно будут создаваться каждый раз, когда они встречаются в блоке компиляции. Если вам нужна скорость компиляции, в С++ 0x мы получаем extern template
s. Он работает как обычные переменные extern
, поскольку он должен быть указан, по крайней мере, в одном модуле компиляции, но компилятор не создает экземпляр шаблона в этом устройстве. См. здесь и этот проект (14.7.2 [temp.explicit]) для получения дополнительной информации.
Ответ 2
Это может произойти, когда проект компилируется, поэтому разные файлы .obj будут иметь копии одного и того же экземпляра. Когда бинарный файл связан, компоновщик удалит все избыточные копии экземпляра, поэтому у конечного двоичного файла будет только одна копия.
Ответ 3
Я думаю, что компилятор использует тот же механизм, что и с функциями-членами обычных классов. Он может сделать их inline
, и я полагаю, что он оставляет информацию о том, что компоновщик использует для сортировки для окончательного двоичного файла.
Единственное различие заключается в том, что компилятор "записывает" определения - это "экземпляр" шаблона, - но ему удается сделать точно такой же экземпляр при компиляции любого из a.cpp или b.cpp
Ответ 4
Это возможно, но только если вы явно их создаете, но тогда вы получите ошибки компоновщика:
// header.hpp
template< typename T >
class A
{
};
// source1.cpp
template class A< int >;
// source2.cpp
template class A< int >;
Если вы явно не создаете шаблоны, любой достойный компоновщик легко устранит копии.