Повторяющиеся экземпляры шаблона C ++ - PullRequest
13 голосов
/ 04 апреля 2011

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

Например, если у вас есть a.cpp, который использует std:vector<int> внутри функции, и то же самое для b.cpp, есть ли риск иметь два раза std::vector<int> в конечном двоичном файле?

Ответы [ 4 ]

8 голосов
/ 04 апреля 2011

Это может произойти во время компиляции проекта, поэтому разные файлы .obj будут иметь копии одного и того же экземпляра.Когда двоичный файл связан, компоновщик удалит все избыточные копии экземпляра, поэтому конечный двоичный файл будет иметь только одну копию.

7 голосов
/ 04 апреля 2011

Как говорит sharptooth, последний двоичный файл будет содержать только один экземпляр.Но шаблоны будут по-прежнему создаваться каждый раз, когда они встречаются в модуле компиляции.Если вам нужна скорость компиляции, в C ++ 0x мы получим extern template s.Он работает как обычные extern переменные в том смысле, что он должен быть указан как минимум в одном модуле компиляции, но компилятор не будет создавать экземпляр шаблона в этом модуле.См. здесь и этот черновик (14.7.2 [temp.explicit]) для получения дополнительной информации.

0 голосов
/ 04 апреля 2011

Это возможно, но только если вы явным образом их создадите, но тогда вы получите ошибки компоновщика:

// header.hpp
template< typename T >
class A
{
};

// source1.cpp
template class A< int >;

// source2.cpp
template class A< int >;

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

0 голосов
/ 04 апреля 2011

Я думаю, что компилятор использует тот же механизм, что и для функций-членов обычных классов.Он может сделать их inline, и я предполагаю, что он оставляет информацию, которую компоновщик использует для сортировки ее для окончательного двоичного файла.

Единственное отличие состоит в том, что компилятор «записывает» определения - то есть«создание экземпляра» шаблона - но ему удается создать точно такой же экземпляр во время компиляции a.cpp или b.cpp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...