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用and编译代码后-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 回答