Допустим, у меня есть два файла .cpp, file1.cpp и file2.cpp, которые используют std::vector<int>
. Предположим, что file1.cpp имеет int main(void)
. Если я скомпилировал оба файла в file1.o и file2.o, и связал два объектных файла в двоичный файл elf, который я могу выполнить. Я компилирую на 32-битной машине с Ubuntu Linux.
Мой вопрос касается того, как компилятор и компоновщик собирают символы для std :: vector:
- Когда компоновщик создает мой последний двоичный файл, есть ли дублирование кода? Есть ли у компоновщика один набор «шаблонного» кода для кода в f1.o, который использует
std::vector
, и другой набор std::vector
кода для кода, который содержит f2.o?
Я попробовал это для себя (я использовал g++ -g
), и я посмотрел на мою окончательную разборку исполняемого файла, и я обнаружил, что метки, сгенерированные для векторного конструктора и других методов, были, по-видимому, случайными, хотя, похоже, код из f1.o вызвали тот же конструктор, что и код из f2.o. Я не мог быть уверен, однако.
Если компоновщик предотвращает дублирование кода, как он это делает? Должен ли он «знать», что такое шаблоны? Всегда ли это предотвращает дублирование кода при многократном использовании одного и того же шаблонного кода в нескольких объектных файлах?