У меня есть два файла:
#include <stdio.h>
static inline void print0() { printf("Zero"); }
static inline void print1() { printf("One"); }
static inline void print2() { printf("Two"); }
static inline void print3() { printf("Three"); }
static inline void print4() { printf("Four"); }
int main()
{
unsigned int input;
scanf("%u", &input);
switch (input)
{
case 0: print0(); break;
case 1: print1(); break;
case 2: print2(); break;
case 3: print3(); break;
case 4: print4(); break;
}
return 0;
}
и
#include <stdio.h>
static inline void print0() { printf("Zero"); }
static inline void print1() { printf("One"); }
static inline void print2() { printf("Two"); }
static inline void print3() { printf("Three"); }
static inline void print4() { printf("Four"); }
int main()
{
unsigned int input;
scanf("%u", &input);
static void (*jt[])() = { print0, print1, print2, print3, print4 };
jt[input]();
return 0;
}
Я ожидал, что они будут скомпилированы почти идентичным ассемблерным кодом. В обоих случаях генерируются таблицы перехода, но вызовы в первом файле представлены jmp
, а вызовы в второй call
. Почему компилятор не оптимизирует call
s? Возможно ли намекнуть gcc, что я хотел бы видеть jmp
вместо call
s?
Скомпилирован с gcc -Wall -Winline -O3 -S -masm=intel
, GCC версии 4.6.2. GCC 4.8.0 создает немного меньше кода, но проблема все еще сохраняется.
UPD: определение jt
как const void (* const jt[])() = { print0, print1, print2, print3, print4 };
и выполнение функций static const inline
не помогло: http://ideone.com/97SU0