3

このコードがあるとしましょう:

inline int func_2 (int a, int b) {
  return time() + a * b;
}

int main (void) {
  int x = (int (*[])(int, int)){func_1, func_2, func_3}[1](6, 7);
}

への間接呼び出しを実際にインライン化するために gcc を何らかの方法で騙すことはできますfunc_*か?

-O2とを使用してコードをコンパイルした後でも、アセンブリ出力で命令を-O3見つけることができました。call func_2

switchこの毛むくじゃらの式は、ケースごとにインライン呼び出しを行うかさばるステートメントに変換できることは知っていますが、コンパクトさから前者の方が好みです。

4

1 に答える 1

3

データ セグメントにスペースを割り当てても問題がなければ、次のように試すことができます。

static int func_2 (int a, int b) {
    return time() + a * b;
}

static int (* const ftab[])(int,int) = {func_1, func_2, func_3};

int foo (void) {
    return ftab[1](6,7);
}

私のgcc 4.4.5は、-O2で関数を正しくインライン化します。

関数のコード内の集計イニシャライザは、期待どおりに定数を転送しません。これが gcc のバグなのか、C ルールの誤解なのかはわかりません。

于 2011-02-24T13:52:34.597 に答える