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
/Oxproduce 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í:
-
/Ox: https://msdn.microsoft.com/en-us/library/59a3b321.aspx -
/O2: https://msdn.microsoft.com/en-us/library/8f8h5cxt.aspx
De acuerdo con aquellos:
-
/Ox→/Og /Oi /Ot /Oy /Ob2 /O2→ lo mismo, pero además agrega/Gs /GF /Gy
Parece que /O2 establece /Gs sin un valor, lo que implica un valor predeterminado de /Gs0 . Y de los documentos para eso:
/Gs0activa 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.