/OPT (Optimizaciones)
Actualización: noviembre 2007
Controla las optimizaciones que efectúa LINK durante una generación.
/OPT:{REF | NOREF}
/OPT:{ICF[=iterations] | NOICF}
/OPT:{WIN98 | NOWIN98}
Argumentos
REF | NOREF
/OPT:REF elimina las funciones y los datos a los que nunca se hace referencia, mientras que /OPT:NOREF mantiene funciones y datos a los que nunca se hace referencia.LINK, de forma predeterminada, quita las funciones empaquetadas sin referencias. Un objeto contendrá funciones empaquetadas (COMDAT) siempre que haya sido compilado con la opción /Gy. A esta optimización se la denomina eliminación transitiva de COMDAT. Para reemplazar este valor predeterminado y mantener en el programa las COMDAT sin referencias, se deberá especificar /OPT:NOREF. Se puede usar la opción /INCLUDE para reemplazar la eliminación de un símbolo concreto.
Si se especifica /DEBUG, el valor predeterminado para /OPT es NOREF (en otro caso, es REF) y todas las funciones se preservan en la imagen. Para reemplazar este valor predeterminado y optimizar una generación de depuración, especifique /OPT:REF. La opción /OPT:REF deshabilita la vinculación incremental.
Se deberán marcar los datos explícitamente como funciones COMDAT; para ello se utilizará __declspec(selectany).
Si se especifica /OPT:REF, /OPT:ICF está activado de manera predeterminada. Si quiere activar /OPT:REF pero no /OPT:ICF, debe especificar lo siguiente:
link /opt:ref /opt:noicf
La especificación de /OPT:ICF no activa la opción /OPT:REF.
ICF[= iterations**] | NOICF**
Utilice /OPT:ICF[=iterations] para realizar un plegamiento idéntico de COMDAT. Las funciones COMDAT redundantes se pueden eliminar de la salida del vinculador. Los valores de iterationespecifican el número de veces que se recorren los símbolos en busca de duplicados. el valor predeterminado para ello será dos. En iteraciones adicionales es posible localizar más duplicados descubiertos mediante el plegamiento de las iteraciones anteriores.Tenga en cuenta que existe una diferencia en el comportamiento del vinculador cuando ICF está en vigor de forma predeterminada con /OPT:REF especificado explícitamente y cuando se especifica explícitamente /OPT:REF,ICF. La opción predeterminada de ICF con /OPT:REF no pliega datos de sólo lectura. Esto incluye todos los .rdata, .pdata y .xdata. Sin embargo, la opción predeterminada de ICF con /OPT:REF origina menos funciones plegadas al producir imágenes para Itanium y x64, ya que las funciones de estos módulos presentan más dependencia de datos de sólo lectura, tales como .pdata y .xdata. Para obtener ICF completo, especifique explícitamente /OPT:ICF.
Las funciones se sitúan en COMDAT con la opción del compilador /Gy; en las COMDAT, a su vez, se incluyen datos const. Vea selectany para obtener un ejemplo de cómo especificar datos de plegamiento.
ICF está activado de forma predeterminada si REF lo está, y es necesario que esté activado explícitamente en una versión de depuración. Es posible especificar NOICF si REF está especificado.
Nota: /OPT:ICF puede provocar que se asigne la misma dirección a funciones o miembros de datos sólo lectura diferentes (variables const compiladas con /Gy). Así pues, /OPT:ICF puede interrumpir un programa que dependa de que la dirección de funciones o miembros de datos de sólo lectura sea diferente. Vea /Gy (Habilitar vinculación en el nivel de función) para obtener más información.
WIN98 | NOWIN98
WIN98 y NOWIN98 controlan la alineación de secciones en la imagen final. En las aplicaciones Windows 98, lo más conveniente es alinear las secciones en un límite de 4 KB a fin de reducir el tiempo de carga (con ello se permite que el administrador de memoria de Windows 98 introduzca en una memoria caché las imágenes ejecutables con el espacio desaprovechado reducido al mínimo). En el vinculador, está habilitada de forma predeterminada, por lo que deberá especificarse /OPT:NOWIN98 si se desea una versión reducida de la aplicación (aunque más lenta en Windows 98).WIN98 está activado de forma predeterminada. WIN98 no está activado cuando:
/MACHINE no tiene x86 por destino
/SUBSYSTEM especifica un valor distinto de WINDOWS o CONSOLE
/OPT:WIN98 no está habilitada de forma predeterminada para imágenes que, de acuerdo con las ecuaciones de crecimiento promedio (explicadas más abajo) aumentan de tamaño en más de un 25%. Es decir, /OPT:WIN98 no está habilitada para las imágenes más pequeñas. Para asegurarse de que este ajuste no tiene efecto, se deberá habilitar /OPT:WIN98 explícitamente. Especifique /OPT:NOWIN98 para obtener una versión más reducida (pero más lenta en Windows 98) de la aplicación.
Las mejoras de Windows 98 sólo funcionan si las secciones de una imagen ejecutable portable empiezan en un límite de página. La opción /OPT:WIN98 realiza la alineación de archivos necesaria.
Si se están generando componentes que sólo se ejecutan en Windows NT o Windows 2000, se deberá utilizar /OPT:NOWIN98.
Este cambio no tendrá repercusiones en la carga de imágenes o el espacio de trabajo del proceso. El único cambio se dará en el tamaño en el disco.
Las siguientes fórmulas ayudan a calcular el crecimiento promedio de una imagen con /OPT:WIN98:
El espacio medio desaprovechado en la alineación de un archivo de 4096 bytes puede representarse por: número-de-secciones-en-imagen * 4096/2
El espacio medio desaprovechado en la alineación del archivo actual de 512 bytes será: número-de-secciones-en-imagen * 512/2
Por lo tanto, el crecimiento será:
crecimiento-del-número-de-bytes = número-de-secciones-en-imagen * (4096/2 - 512/2)
o, una vez simplificado:
crecimiento-del-número-de-bytes = número-de-secciones-en-imagen * 1792
Sin embargo, en la fórmula anterior no se tiene en cuenta que el encabezado de la imagen debe estar relleno en la alineación de sección. Al tener el encabezado siempre como máximo 512 bytes, el crecimiento extra será constante: 4096 - 512 o, lo que es lo mismo, 3584.
crecimiento-del-número-medio-de-bytes = número-de-secciones-en-imagen * 1792 + 3584
crecimiento-máximo-del-número-de-bytes = número-de-secciones-en-imagen * (4096 –512 + 3584)
Para obtener el número de secciones, se debe usar la herramienta DUMPBIN en un archivo ejecutable. El resumen proporcionará una lista de las secciones de la imagen. Habitualmente, se agregarán de 3 a 5 secciones a ese valor.
La única circunstancia en que no se puede usar /OPT:WIN98 es ante imágenes ejecutables portables muy pequeñas. Incluso con imágenes preparadas para descargas, el espacio desaprovechado se rellenará con ceros y se comprimirá bien.
Comentarios
Las optimizaciones normalmente disminuyen el tamaño de la imagen y aumentan la velocidad del programa, a costa de un incremento del tiempo de vinculación.
Puede utilizar la opción /VERBOSE para ver las funciones que se han quitado mediante /OPT:REF y las funciones que se han plegado mediante /OPT:ICF.
Para establecer esta opción del vinculador en el entorno de desarrollo de Visual Studio
Abra el cuadro de diálogo Páginas de propiedades del proyecto. Para obtener más información, vea Establecer las propiedades de un proyecto de Visual C++.
Haga clic en la carpeta Vinculador.
Haga clic en la página de propiedades Optimización.
Modifique una de las propiedades siguientes:
Habilitar plegamiento de COMDAT
Optimizar para Windows 98
Referencias
Para establecer esta opción del vinculador mediante programación
- Vea EnableCOMDATFolding, OptimizeForWindows98 y las propiedades OptimizeReferences.