Digamos que tengo dos archivos .cpp, archivo1.cpp y archivo2.cpp, que usan std::vector<int>
. Supongamos que file1.cpp tiene un int main(void)
. Si compilé ambos en file1.o y file2.o, y vinculé los dos archivos de objeto en un binario de duende que puedo ejecutar. Estoy compilando en una máquina Ubuntu Linux de 32 bits.Archivos de objeto en C++ con plantilla
Mi pregunta se refiere a cómo el compilador y el enlazador juntos los símbolos para el std :: vector:
- Cuando el enlazador hace que mi binario final, ¿hay duplicación de código? ¿El enlazador tiene un conjunto de código "con plantilla" para el código en f1.o que usa
std::vector
y otro conjunto de códigostd::vector
para el código que comprende f2.o?
yo probamos este para mí (he usado g++ -g
) y miré el desmontaje ejecutable final, y me encontré con las etiquetas generadas por el constructor de vectores y otros métodos eran aparentemente al azar, aunque el código de f1.o apareció haber llamado al mismo constructor que el código de f2.o. Sin embargo, no podría estar seguro.
Si el enlazador previene la duplicación del código, ¿cómo lo hace? ¿Debe "saber" qué plantillas son? ¿Siempre previene la duplicación de código con respecto a múltiples usos del mismo código de plantilla en múltiples archivos de objeto?
Esto no se refiere a la mayor parte de la pregunta de la OP. Es cierto, pero no es particularmente relevante para lo que se pregunta aquí. – templatetypedef
@templatetypedef - Me permito diferir. * Si el enlazador impide la duplicación del código, ¿cómo lo hace? ¿Debe "saber" qué plantillas son? * El enlazador sabe a través del cambio de nombre. Código en línea: está duplicado, el vinculador no tiene nada que ver con eso. – littleadv
@ littleadv- Tiene toda la razón, pero su respuesta no explica por qué el enlazador utiliza el nombre de manipulación, cómo los nombres destrozados para las funciones de plantilla difieren de las funciones normales, cómo el vinculador decide qué versiones elegir, etc.No estoy tratando de decir que esto es fuera de tema o incorrecto, sino que a menos que ya supiera la respuesta a la pregunta, no creo que esta respuesta sea útil. – templatetypedef