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