【发布时间】:2011-07-03 03:29:45
【问题描述】:
假设我们有这个代码:
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 语句,每个 case 都有内联调用,但我更喜欢前者,因为它紧凑。
【问题讨论】:
-
从您的代码来看,您似乎真的不顾一切地想要让它工作,不是吗? :)
-
嗯,一点恒定折叠应该允许内联。但是既然它无论如何只适用于常量,为什么不直接调用它呢?
-
@delnan:真正的代码使用了变量索引,我只是尽量减少显示的代码。
-
对我来说,很明显你应该使用在编译时众所周知的常量索引,或者直接调用函数。否则,链接器将无法知道应该选择什么功能实现来扩展。也许宏连接(虽然是语义糖)?
标签: c gcc compiler-optimization indirection inline-functions