2011-10-18 4 views
6

Según el estándar, las funciones en línea externas deben tener la misma dirección en todas las unidades de traducción.Las funciones en línea externas deben tener la misma dirección en todas las unidades de traducción. ¿Cómo diablos es eso logrado?

¿Cómo se logra esto en el compilador? Quiero decir, cuando estoy compilando alguna unidad de traducción, no tengo idea de cómo será la otra unidad de traducción. Entonces, ¿cómo puedo tener la misma dirección en todas partes?

Respuesta

6

Eso depende de la implementación, pero generalmente es resuelto por el vinculador. Cada unidad de traducción compilada producirá un archivo objeto que contiene una copia de la función, marcada de alguna manera para que el vinculador sepa que debe esperar (y aceptar) duplicados. El enlazador incluirá uno de ellos, descartará los otros y resolverá cualquier referencia a la función.

+0

¿Qué pasa con las bibliotecas? ¿O voy a ir lejos? –

+0

No importa, me acabo de dar cuenta de que no hay diferencia :) –

+0

@Let_Me_Be: Las bibliotecas estáticas suelen ser solo una colección de archivos objeto, por lo que probablemente contengan varias copias de la función, que se resolverán más tarde cuando se vincule a un programa. Las bibliotecas compartidas generalmente se vinculan como un programa, por lo que se pueden eliminar múltiples copias. –

4

Estrategia simple: cada vez que se define una función como inline, compilarla al tiempo del objeto como si fuera una función normal. Luego, en el momento del enlace, detectar funciones duplicadas y eliminarlas, dejando una copia de cada una. Así es como funcionaban los compiladores de C++ (también frente a las plantillas) hace unos 10 años. No estoy seguro de cómo lo hacen hoy en día.

Cuestiones relacionadas