У меня есть два файла:
#include
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
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
s вместо 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