私は2つのファイルを持っています:
#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
、2 番目のファイルの呼び出しは で表されますcall
。call
コンパイラがsを最適化しないのはなぜですか? jmp
s の代わりにsを表示したいことを gcc に示唆することは可能call
ですか?
gcc -Wall -Winline -O3 -S -masm=intel
、GCC バージョン 4.6.2 でコンパイル。GCC 4.8.0 ではわずかに少ないコードしか生成されませんが、問題は解決しません。
UPDjt
: asの定義const void (* const jt[])() = { print0, print1, print2, print3, print4 };
と関数の作成static const inline
は役に立ちませんでした: http://ideone.com/97SU0