gcc可以通过常量函数指针数组内联函数调用吗?

时间:2011-02-23 22:17:22

标签: c gcc compiler-optimization indirection inline-functions

假设我们有这段代码:

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语句,每个案例都有内联调用,但我更喜欢前者的紧凑性。

1 个答案:

答案 0 :(得分: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规则的误解。