Зачем вызывать, когда достаточно jmp?

У меня есть два файла:

#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 .Почему компилятор не оптимизирует calls? Можно ли намекнуть gcc, что я хотел бы видеть jmps вместо calls?

Скомпилировано с 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

11
задан Joulukuusi 15 May 2012 в 14:22
поделиться