通过名称和函数指针在C中调用函数

时间:2016-06-10 13:59:01

标签: c function pointers

我想知道通过名称调用函数有什么区别,比如

int sum(int x,int y)
 {
    return x+y;
 }

int main()
 { 
    int z = sum(5,7);
 }

并通过指针调用函数,如

int sum(int x,int y)
 {
    return x+y; 
 }

int main()
 {  
    int (*ptr)(int,int);
    ptr =∑
    int z = (*ptr)(5,7); 
 }

执行时间或其他方面有什么不同吗?

2 个答案:

答案 0 :(得分:6)

对于编译器,优化通过名称调用函数的代码更容易,因为在编译时已知代码调用哪个函数。

另一方面,对于(非const)函数指针,很难知道指针指向哪个函数,因此编译器可能无法通过函数指针优化(例如内联)函数调用。 / p>

答案 1 :(得分:0)

第一个将在程序集中转换为带有中间参数的CALL。第二个将转换为带有寄存器或内存地址作为参数的CALL(间接调用)。

现在两种方法的性能都取决于目标机器支持使用非中间参数调用子程序的能力。

例如,the x86 instruction set允许CALL指令具有中间参数,寄存器参数或内存参数。对于近距离呼叫,可以使用这三种方法。对于远程调用,只有中间和内存参数可用。这意味着通常,通过指针调用函数会有一点点损失,因为在使用另一条指令进行实际调用之前,必须从内存加载要调用的地址。中间操作数调用还必须加载要从内存调用的地址(在指令获取阶段),但它不需要单独的指令来执行此操作,因此这有点(一个或两个周期)更快。