Optymalizacja C++
Lookup tables

Jeżeli zbiór możliwych wartości jest skończony można zastąpić obliczenia lookup table

int factorial (int n) { // n!
  int i, f = 1;
  for (i = 2; i <= n; i++) f *= i;
  return f;
}
int factorial (int n) {  // n!
  // Table of factorials:
  static const int FactorialTable[13] = {
    1, 1, 2, 6, 24, 120, 720, 5040, 40320, 
    362880, 3628800, 39916800, 479001600};
  if ((unsigned int)n < 13) 
    return FactorialTable[n]; // Table lookup
  else 
    return 0;     // return 0 if out of range
}
Dodanie static const umożliwia optymalizację przez propagacje stałych.

float a; bool b;
a = b  ? 1.0f : 2.5f;
float a; int b;
static const float lookup[2] = {1.0f, 2.5f};
a = lookup[b];
Nawet jeżeli b jest typu bool nie mamy pewności, że wartość to 0 lub 1, jeżeli pochodzi z niezaufanej funkcji.

int n;
switch (n) {
  case 0: printf("Alpha"); break;
  case 1: printf("Beta");  break;
  case 2: printf("Gamma"); break;
  case 3: printf("Delta"); break;
}
int n;
static char const * const Greek[4] = {
  "Alpha", "Beta", "Gamma", "Delta"
};
if ((unsigned int)n < 4) { 
  printf(Greek[n]);
}


Tomasz Kapela, Kraków 2011-2020