2009-12-02 27 views

Respuesta

68

El currently accepted answer es algo incompleto.

El propósito de una sección COMDAT es permitir que las secciones "duplicadas" se definan en varios archivos de objeto. Normalmente, si el mismo símbolo se define en varios archivos de objeto, el vinculador informará los errores. Esto puede causar problemas para algunas características del lenguaje C++, como plantillas, que pueden instanciar los mismos símbolos en diferentes archivos cpp.

Las secciones COMDAT se utilizan para evitar esto. Cuando una sección está marcada como COMDAT en un archivo de objeto, también especifica un indicador que indica cómo se deben resolver los conflictos. Hay un montón de opciones, entre las que se incluyen "solo elija a quien desee", "asegúrese de que todas las conexiones sean del mismo tamaño", "asegúrese de que todas las conexiones tengan el mismo contenido", "elija la más grande", etc. la especificación COFF para una lista completa.

En cualquier caso, a diferencia de lo que dijo el currently accepted answer, no hay requisitos, de una forma u otra, sobre cuál debe ser el contenido de una sección COMDAT. Pueden contener un procedimiento, muchos procedimientos, datos o cualquier combinación de código y datos.

5

/opción de Gy es bueno para ser utilizado en compilaciones de lanzamiento. porque cada función tiene su propia sección, el enlazador puede eliminar cada pieza de código no utilizada. Si no especifica la opción/Gy obtendrá algo como esto: "a.cpp" define 3 funciones y el compilador las coloca en una sección de código al compilar. "main.cpp" usa solo una función de "a.cpp", pero cuando se vinculan todas las funciones de "a.cpp" se vinculará (dos de ellas como una carga). Y si cada función tuviera su propia sección, el enlazador podría recoger solo una que contenga la función que necesita "main.cpp". La compilación sin la opción/Gy es buena para compilaciones de depuración. Al compilar una clase, todos sus métodos tienen sus propias secciones por defecto.

+3

Esto es viejo, pero para información de cualquiera: así no es como funciona el enlazador. Hay un conmutador totalmente diferente que controla las funciones sin referencia:/OPT: REF (Optimización-> Referencias: Sí). Hay otro derecho debajo que fusiona funciones idénticas,/OPT: ICF. ICF solo funciona con/Gy, pero REF funciona con o sin él. – SilverbackNet

Cuestiones relacionadas