2011-02-23 37 views
2

比方说,我们有这样的代码:gcc可以通过一个常量函数指针数组内联一个间接函数吗?

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

从你的代码判断,看起来你真的*非常渴望得到这个工作,不是吗? :) – Mehrdad

+0

那么,一个不断折叠*应该*允许内联。但是由于它只适用于常量,为什么不直接调用呢? – delnan

+0

@delnan:真正的代码使用变量索引,我只是试图最小化显示的代码。 –

回答

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功能。

功能,因为我们预计恒不转发的代码内部的聚合初始值,我不知道wheter这是gcc的一个bug或者我们的一些C规则的误解。

+0

从评论中,索引应该是_variable_而不是_constant_。 –

+0

当然,在这种情况下,答案是否定的,GCC将不会内联常量函数表中的所有函数并自动生成一个开关。 –

相关问题