Допустим, при старте программы определяется, какая из множества возможных функций будет вызываться. Допустим, вызов происходит на критическом по производительности участке - тогда расходы на вызов по указателю нежелательны. Рождается трюк, идея:
#include <string.h>
#include <stdio.h>
typedef int (*Func)(void);
#ifdef PATCH
char buf[1024];
#define func ((Func)buf)
#else
Func func;
#endif
int f1(void) { return 1; }
int f2(void) { return 2; }
int f_(void) { return 0; }
int main(void)
{
int i, sum = 0;
#ifdef PATCH
memcpy(buf, f2, (char *)f_ - (char *)f2);
#else
func = f2;
#endif
for(i = 0; i != 0xFFFFFFF; ++i)
sum += func();
printf("sum = %d\n", sum);
return 0;
}
$ cc -O2 main.c && time ./a.out
sum = 536870910
real 0m1.353s
user 0m1.350s
sys 0m0.010s
$ cc -O2 -DPATCH main.c && time ./a.out
sum = 536870910
real 0m0.968s
user 0m0.960s
sys 0m0.000s
1. размер функции не определить в общем случае надежно;
2. buf может оказаться неисполняемым.
Можно как-нибудь обойти эти проблемы? Еще лучше, есть стандартные решения для подобных хаков?