parametros ejecutar con compilar compilador c++ visual-studio visual-c++ compiler-optimization compiler-options

c++ - ejecutar - gcc linux



¿Cuál es la diferencia entre las opciones del compilador/Ox y/O2? (2)

Lo encontré here :

Ox y O2 son casi idénticos. Difieren solo en el hecho de que O2 también arroja GF y Gy . No hay casi ninguna razón para evitar lanzar estos dos interruptores.

El compilador C ++ de Microsoft ( cl.exe , como se incluye con Visual Studio) ofrece varios conmutadores de optimización . La diferencia entre la mayoría de ellos parece explicarse por sí misma, pero no está claro para mí cuál es la diferencia entre /O2 (que optimiza el código para la velocidad máxima) y /Ox (que selecciona "optimización completa").

Intenté leer la documentation de la opción /Ox , y parece confirmar que este modificador también permite optimizaciones para la velocidad máxima, en lugar del tamaño:

La opción del compilador /Ox produce código que favorece la velocidad de ejecución en un tamaño más pequeño.

Pero en particular, la siguiente declaración en la sección "Comentarios" llamó mi atención:

En general, especifique /O2 (Maximizar velocidad) en lugar de /Ox .

Entonces mi pregunta es, ¿por qué uno debería favorecer /O2 más /Ox ? ¿La última opción habilita una optimización particular conocida que causa errores imprevistos o comportamiento inesperado? ¿Es simplemente que la cantidad de optimización que se va a ganar no vale la pena el tiempo de compilación adicional? ¿O se trata de una "recomendación" completamente sin sentido como resultado del hecho de que /O2 es la opción predeterminada en VS?


La respuesta de Asha cita una publicación de blog sobre Visual Studio 2005, y está bastante desactualizada.

La última versión de la documentación está disponible aquí:

De acuerdo con aquellos:

Parece que /O2 establece /Gs sin un valor, lo que implica un valor predeterminado de /Gs0 . Y de los documentos para eso:

/Gs0 activa las sondas de pila para cada llamada de función que requiere almacenamiento para variables locales. Esto puede tener un impacto negativo en el rendimiento.

So /O2 puede ser más lento que /Ox para usted, solo por eso. IMO que es lo suficientemente sorprendente como para parecerse a un error (ya sea en los documentos o en la implementación).

También puede estar interesado en /GS- que desactiva las comprobaciones de seguridad alrededor de la pila, lo que puede ser un golpe de rendimiento significativo (consulte los documentos de MS para / GS ).

Debe comparar su aplicación específica, como siempre.