2012-04-26 15 views
6
void run_hot(void) { 
    // I am called very often! 
    serve(); 
    // <more code here> 
} 

void run_cold(void) { 
    // I am called only occasionally! 
    serve(); 
    // <more code here> 
} 

???inline??? void serve(void) { 
    // I only want to be called inline from hot functions! 
    // <more code here> 
} 

¿Hay alguna manera de forma explícita una función inline Un en una función B, mientras que explícitamente no inlining la misma función A en una función C ? ¿O estoy completamente a merced de mi compilador?¿Puedo alinear una función parcial/selectivamente?

+0

Puede inhibir la alineación poniendo una función en una unidad de compilación separada. –

+0

@JensGustedt ¿Puedes dar un ejemplo? Tengo algunas dificultades para adivinar qué tipo de plan tienes en mente. – Will

+0

Si no desea que una función esté en línea, coloque la definición en un archivo .c separado y compílela por separado. –

Respuesta

4

Usted está completamente a merced del compilador con inlining.
Deje de lado parcialmente, ya sea inline o no, una función es únicamente una decisión que es mejor hecha por el compilador y debe confiar en ella para tomar la mejor decisión.

+0

> si alinear o no una función es la única decisión que toma el compilador De hecho, eso parece ser una sabiduría convencional, y normalmente lo más inteligente que hacer juzgar qué funciones están "activas", el compilador necesita saber sobre el tipo de datos que el programa manejará, que por supuesto no sabe si los datos llegan desde IO externo. Entonces me parece que hay casos en los que el programador humano sabe más ... – Will

+3

@Will Si está usando GCC, puede usar '__attribute __ ((hot))' para decirle al compilador que optimice esa función más, entonces no tendría que adivinar. – ughoavgfhw

+0

@ughoavgfhw ¡Excelente! ¡Gracias! – Will

Cuestiones relacionadas