2009-04-28 21 views
28

yo sólo estoy empezando con el compilador g ++ en Linux y tengo algunas preguntas sobre las opciones del compilador. Aquí están losOptimización y banderas para hacer una biblioteca estática con g ++

optimizaciones

leí acerca de parámetros de optimización -O1, -O2 y -O3 en la página del manual 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 desenrollado del lazo, ¿cómo se logra dicho rendimiento? ¿Se recomienda esta opción?

biblioteca estática

¿Cómo se crea una biblioteca estática por medio de 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 ++?

+1

[En 2003, el -O3 de GCC tenía errores y recibió una mala reputación.] (Http://stackoverflow.com/a/11546263/845092) Hoy en día produce código incorrecto solo cuando se rompen las reglas, pero a la gente le gusta romper reglas y enojarse cuando ocurren las consecuencias, por lo que se quedan con -O2 para evitar las consecuencias de escribir código ilegal. –

Respuesta

2

Hay muchas optimizaciones que un compilador puede realizar, aparte de desenrollado bucle y procesos en línea. desenrollado bucle y procesos en línea se mencionan específicamente allí, ya que, a pesar de que hacen el código más rápido, sino que también hacen que sea más grande.

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

+0

Gracias. ¿Qué es "ar"? ¿Es eso un compilador de compilación g ++ o un shell? Sería genial si puedes mostrarme cómo se usa "ar". –

+0

No hay problema. He marcado "ar" y encontré el manual para él. Muchas gracias por eso –

4

En cuanto a cuándo utilizar lo 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 el patrón de ejecución que tiene, y depende de la CPU específico que se está ejecutando.

(Para dar un ejemplo canónico simple: el compilador puede decidir utilizar una optimización que hace que su código sea ligeramente más grande que antes. Esto puede hacer que cierta parte del código ya no entre en la caché de instrucciones, en cuyo punto se necesitarían muchos más accesos a la memoria, 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 realizan en el código, más difícil es depurarlo usando un depurador (o leer su desensamblaje), porque la vista fuente C/C++ se aleja del binario generado . Es una buena regla general trabajar con menos optimizaciones al desarrollar/depurar por este motivo.

41

La regla de oro:

Cuando tenga que depurar, utilice -O0 (. Y -g para generar símbolos de depuración)

Cuando se está preparando para enviarlo, utilice O2.

Cuando use gentoo, use -O3 ...!

Cuando tenga que ponerlo en un sistema embebido, utilice -OS (para optimizar el tamaño, no por la eficiencia.)

+6

¿Por qué no usar -O3 para todas las plataformas? Windows no puede manejar -O3? –

+0

Gracias por la regla general, Josh. La página man de Linux no incluía este orden crítico. – theJollySin

+1

Solo quería defender la cosa -O3 al señalar que puede causar más problemas de los que resuelve. -O3 implica desenrollar por defecto el bucle y otras optimizaciones peligrosas que hacen suposiciones sobre cómo se llama su código. -O2 es seguro como regla general, pero debe tener una/razón/para ir a -O3. –

5

La lista manual de gcc 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, se utiliza 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.

0

En cuanto a la pregunta sobre la biblioteca estática, la respuesta dada por David Cournapeau es correcta, pero alternativamente puede usar la bandera 's' con 'ar' en lugar de ejecutar ranlib en su archivo de biblioteca estática. El 'ar' manual page indica que

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

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

Cuestiones relacionadas