2011-09-04 7 views
6
#include <stdlib.h> 

inline int f0(int a) { 
    return a*a; 
} 

inline int f1(int a) { 
    return a*a*a; 
} 

int main() { 
    int (*f)(int); 
    f = rand()%2 ? f0 : f1; 
    return f(rand()); 
} 

Así que con gcc, el archivo asm generado es el mismo con o sin línea. ¿Es lo mismo con cualquier código con indicadores de función?¿Se pueden insertar las funciones utilizadas a través de los punteros de función?

+1

Tenga en cuenta que la mayoría de los compiladores, incluido gcc, realmente no se preocupan por su 'en línea' cuando deciden si alinean algo. Definitivamente puede ignorarlo y me sorprendería si la presencia de 'en línea' tuviera mucha influencia en la heurística que lo decide. – delnan

Respuesta

6

Los punteros de función no se pueden alinear a menos que su valor sea totalmente decidible en tiempo de compilación. Tu caso no es decidible.

La mayoría de las veces, los punteros a las funciones nunca se insertarán, incluso si el compilador puede ver qué función está en el puntero de la función.

+1

Estoy de acuerdo con la mayor parte de esto. Sin embargo, 'f0' y' f1' * podrían * estar en línea aquí ('if (rand% 2) {/ * código para f0 * /} else {/ * código para f1 * /}'). Pero dudo que ningún compilador tenga una heurística para detectar este tipo de cosas. –

Cuestiones relacionadas