flag c++ optimization g++ compiler-flags

c++ - gcc flag



Optimización y banderas para hacer una biblioteca estática con g++ (5)

Con respecto a la pregunta de la biblioteca estática, la respuesta dada por es correcta, pero alternativamente puede usar la bandera ''s'' con ''ar'' en lugar de ejecutar ranlib en su archivo de biblioteca estática. La página del manual ''ar'' indica que

Ejecutar ar s en un archivo es equivalente a ejecutar ranlib en él.

Cualquiera que sea el método que use, es solo una cuestión de preferencia personal.

Estoy comenzando con el compilador g ++ en Linux y recibí algunas preguntas sobre los indicadores del compilador. Aquí están ellos

Optimizaciones

Leí acerca de los indicadores de optimización -O1 , -O2 y -O2 en la página de manual de g ++. No entendí cuándo usar estas banderas. Por lo general, ¿qué nivel de optimización usa? El manual de g ++ dice lo siguiente para -O2 .

Optimizar aún más. GCC realiza casi todas las optimizaciones admitidas que no implican una compensación de velocidad de espacio. El compilador no realiza desenrollado de bucle o función en línea cuando especifica -O2. En comparación con -O, esta opción aumenta el tiempo de compilación y el rendimiento del código generado.

Si no se está realizando la alineación y el despliegue del bucle, ¿cómo se logra dicho rendimiento y se recomienda esta opción?

Biblioteca estática

¿Cómo creo una biblioteca estática usando g ++? En Visual Studio, puedo elegir un proyecto de biblioteca de clase y se compilará en un archivo "lib". ¿Cuál es el equivalente en g ++?


El manual de gcc enumera todas las opciones implícitas por cada nivel de optimización. En O2, obtienes cosas como plegado constante, predicción de ramificación y co, que pueden cambiar significativamente la velocidad de tu aplicación, dependiendo de tu código. Las opciones exactas dependen de la versión, pero están documentadas con gran detalle.

Para construir una biblioteca estática, use ar de la siguiente manera:

ar rc libfoo.a foo.o foo2.o .... ranlib libfoo.a

Ranlib no siempre es necesario, pero no hay ninguna razón para no usarlo.


En cuanto a cuándo usar qué opción de optimización, no hay una única respuesta correcta.

Ciertos niveles de optimización pueden, a veces, disminuir el rendimiento. Depende del tipo de código que está escribiendo y del patrón de ejecución que tiene, y depende de la CPU específica en la que se esté ejecutando.

(Para dar un ejemplo canónico simple, el compilador puede decidir usar una optimización que hace que su código sea un poco más grande que antes. Esto puede hacer que cierta parte del código ya no se ajuste a la caché de instrucciones, en ese punto muchos más accesos a la memoria sería necesaria, en un bucle, por ejemplo).

Lo mejor es medir y optimizar lo que necesite. Intenta, mide y decide.

Una regla importante: cuantas más optimizaciones se realicen en su código, más difícil será depurarlo utilizando un depurador (o leer su desensamblaje), porque la vista fuente de C / C ++ se aleja del binario generado. Es una buena regla general trabajar con menos optimizaciones al desarrollar / depurar por este motivo.


Hay muchas optimizaciones que un compilador puede realizar, aparte del desenrollado del bucle y la alineación. El bucle de desenrollar y alinear se menciona específicamente allí ya que, aunque hacen el código más rápido, también lo hacen más grande.

Para crear una biblioteca estática, use ''g ++ -c'' para generar los archivos .o y ''ar'' para archivarlos en una biblioteca.


La regla de oro:

Cuando necesite depurar, use -O0 (y -g para generar símbolos de depuración).

Cuando se prepare para enviarlo, use -O2.

Cuando usas gentoo, usa -O3 ...!

Cuando necesite colocarlo en un sistema integrado, use -Os (optimice para el tamaño, no para la eficiencia).