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í:
-
/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:
/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.