tengo dos sugerencias sobre la eliminación de sus llamadas a funciones virtuales, si necesario para el rendimiento. En aras de la ilustración, suponga que tiene una función que toma un puntero a función como un argumento:
void my_algorithm(int (*func)(...), ...)
{
/* ... */
}
Y también supongamos que se sabe de antemano todos los posibles valores del puntero de función puede tomar. Por ejemplo:
my_algorithm(func_1, ...);
//...
my_algorithm(func_2, ...);
Primera convertir su my_algorithm originales() en una macro:
#define MY_ALGORITHM(func, ...) \
{ \
/* ... */ \
}
vuelva a grabar my_algorithm() como:
extern int func_1(...);
extern int func_2(...);
void my_algorithm(int (*func)(...), ...)
{
if (func == func_1)
MY_ALGORITHM(func_1, ...)
else if (func == func_2)
MY_ALGORITHM(func_2, ...)
else
assert(0 && "Unexpected function arg to my_algorithm()");
}
Esto, por supuesto duplicar el tamaño de el archivo de objeto compilado. Y, en la superficie, elimina solo un nivel de indirección. Pero si func_1 y/o func_2 están en línea, puede obtener una aceleración considerable.
e incluso se puede macros 'pass', como en:
#define HYPOT_Y(x) hypot(x, y)
MY_ALGORITHM(HYPOT_Y, ...); //assumes y is known
La segunda sugerencia es una variación de este, usando macros X (http://en.wikipedia.org/wiki/C_preprocessor#X-Macros). En lugar de #define, coloque el cuerpo del my_algorithm original() en un archivo separado, my_algorithm.h. Vuelva a grabar my_algorithm() como:
void my_algorithm(int (*func)(...), ...)
{
if (func == func_1)
#define func func_1
#include "my_algorithm.h"
#undef func
else if (func == func_2)
#define func func_2
#include "my_algorithm.h"
#undef func
else
assert(0 && "Unexpected function arg to my_algorithm()");
}
probablemente volvería a usar macros X si el código es más que un par de docenas de líneas. Sus ventajas incluyen (sin juego de palabras):
- No hay barras invertidas feas
- Depuración más fácil (por ejemplo, de nuevo trazas y de un solo paso a paso).
Esto es todo el estándar C. Pero más bien de la vieja escuela.
Sí, es una opción que estaba considerando, pero yo estaba pensando en algo más sencillo, no creo Necesito todo el JIT, solo pegar algunas funciones juntas como si fueran simplemente una gran función. Gracias de todos modos :-) – fortran