可以說我有兩個.cpp文件,file1.cpp和file2.cpp,它們使用std::vector<int>
。假設file1.cpp有一個int main(void)
。如果我將它們編譯爲file1.o和file2.o,並將兩個目標文件鏈接成一個我可以執行的elf二進制文件。我正在一個32位的Ubuntu Linux機器上編譯。模板化的C++目標文件
我的問題關於編譯器和鏈接器放在一起爲標準::向量的符號:
- 當鏈接讓我最終的二進制,有沒有代碼重複?鏈接器是否有一組「模板化」的代碼用於f1.o中的代碼,它使用
std::vector
和另一組std::vector
代碼包含f2.o的代碼?
我想這對我自己(我用g++ -g
),我看了看我最後的可執行拆卸,而且我發現了矢量構造等方法生成的標籤顯然是隨機的,雖然從f1.o代碼出現調用與f2.o中的代碼相同的構造函數。不過,我無法確定。
如果鏈接器確實阻止代碼重複,它是如何做到的?它必須「知道」什麼模板?它是否始終防止跨多個目標文件多次使用相同模板化代碼的代碼重複?
這並沒有解決大部分OP的問題。這是真的,但它與這裏提出的問題並不特別相關。 – templatetypedef
@templatetypedef - 我不同意。 *如果鏈接器確實阻止了代碼重複,它是如何實現的?它必須「知道」模板是什麼?*鏈接器知道通過名稱修改。內聯代碼 - 是重複的,鏈接器與它無關。 – littleadv
@ littleadv-你是絕對正確的,但你的答案並不能解決爲什麼鏈接器使用名稱修飾,模板函數的改變名稱與常規函數不同,鏈接器如何決定選擇哪個版本等。我並不是想說這是無關緊要或不正確的,但是除非你已經知道問題的答案,否則我不認爲這個答案會有幫助。 – templatetypedef