Шаблонные объектные файлы C ++

Допустим, у меня есть два файла .cpp, file1.cpp и file2.cpp, которые используют std :: vector < интервал> . Предположим, что 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. Однако я не мог быть уверен.

Если компоновщик действительно предотвращает дублирование кода, как он это делает? Должен ли он «знать», что такое шаблоны? Всегда ли предотвращается дублирование кода при многократном использовании одного и того же шаблонного кода в нескольких объектных файлах?

9
задан CashCow 1 July 2011 в 00:10
поделиться