Повторяющиеся экземпляры шаблонов С++

Возможно ли, чтобы компилятор дублировал экземпляры одного шаблона в нескольких единицах перевода?

Например, если у вас есть 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 >;

Если вы явно не создаете шаблоны, любой достойный компоновщик легко устранит копии.