假设我们有这段代码:
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
语句,每个案例都有内联调用,但我更喜欢前者的紧凑性。
答案 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规则的误解。