2012-03-19 8 views
6

Si no declaro una función f como en línea. Así como sigue:funciones automáticamente en línea en unidades de traducción y gcc 4.6

Ah:

X f(Y y); 

a.cpp:

X f(Y y) 
{ 
    ... 
} 

Luego, en una unidad de traducción diferente:

B.cpp:

#include "A.h" 

Z g(W w) 
{ 
    ... 
    ... f(...) ... 
    ... 
} 

Luego compilo las dos unidades de traducción A.o y B.o con gcc 4.6, y luego vincularlos también a través de gcc. (Tal vez con -O3 en ambos pasos)

¿Considerará gcc la función para el rendimiento en tiempo de enlace? ¿O es demasiado tarde?

En una revisión del código, alguien sugirió que no debería declarar mis funciones como en línea, ya que el compilador sabe mejor que yo cuándo alinear. Siempre tuve la impresión de que, a menos que la función esté definida en el encabezado, el compilador no tiene la opción de alinearla.

(Si la respuesta es diferente para el modo C, C++ modo, o GNU ++ 0x modo de favor señalar esto también)

+0

¿Por qué quieres hacer tal cosa? 'inline' fue inventado para eso. Le permite tener la definición de la función en el archivo de encabezado sin tener errores de "múltiples símbolos definidos". Y funciona bastante bien hoy en día, los compiladores tienen buenas estrategias para alinear efectivamente una función o no. –

+0

@JensGustedt: ¿Por qué? Pereza. Preferiría que el optimizador descubriera cuándo es mejor alinear una función, de la misma manera que se da cuenta cuándo colocar una variable local en un registro en lugar de en la pila. Creo que esta es una visión incontrovertible, y te has perdido el punto. –

+0

Hm, eso es exactamente lo que dije. Dale al compilador la oportunidad de hacerlo por ti. 'inline' no significa nada más que pedirle al compilador que lo haga cuando sea apropiado. Para seguir con su ejemplo, una variable local es completamente visible en el punto donde el compilador decide mantenerlo en un registro o derramarlo. Escriba código limpio, y el compilador será amable con usted. Y francamente, ¿por qué es más difícil tener la definición de una función en un archivo de encabezado que en un archivo .c? Exactamente el mismo texto en un lugar diferente? –

Respuesta

12

La función se denomina Link Time Optimization(LTO) y no está habilitado por defecto en GCC 4.6

[editar] Con LTO habilitado, GCC ahorrará una representación "Gimple" de X f(Y y) en A.obj. Esta representación es un poco más procesada que el preprocesamiento habitual de C++, pero no mucho. En particular, aún no está traducido al ensamblaje. Como resultado, el enlazador aún puede alinearlo.

+0

¿Podría agregar una breve descripción de cómo funciona esto en este escenario específico? No tenía ni idea de esto. –

-1

No creo que gcc puede crear funciones se dividen en diferentes archivos de origen como en línea. Solo funciona si los declaras en el mismo archivo fuente.

-1

El compilador puede elegir alinear o no para mejorar el rendimiento. Pero en este caso el compilador está indefenso, creo. no hay forma de que pueda alinear la función f.

NB: Incluso si utiliza la palabra clave es solo una sugerencia. la decisión final de si se debe alinear o no depende del compilador. Entonces no hay ningún problema al sugerir al compilador.

Cuestiones relacionadas