在C中使用函数指针有效吗?

时间:2018-10-29 10:12:24

标签: c function-pointers

函数指针会影响程序的运行时间吗?

int (*fptr1)(int);

int square(int num) {
    return num*num;
}

int main()
{
    int n = 5;
    fptr1 = square;
    printf("%d squared is %d\n",n, fptr1(n));
    return 0;
}

3 个答案:

答案 0 :(得分:5)

这是一个很难回答的问题,因为它的级别很低,并且通常归结为“取决于”。

通常,假设实际使用了函数指针,我希望它会产生成本,因为这是额外的步骤。与跳转到加载时已知的恒定位置相比,加载变量的值然后跳转到变量之间是有区别的。例如,由于缓存的原因,该成本可能会在程序执行过程中发生变化,但可能永远不会为零。当然,使用函数指针当然也可以使代码以整体上更快的方式进行结构化,因此它仍然可以是肯定的。

例如,考虑:

for (a bajillion)
{
  if (something complex)
  {
    function1();
  }
  else
  {
    function2();
  }
}

这会使复数if达到数十亿次,这当然会花费很多。可以使用函数指针进行重构:

const void (*function)(void) = (something complex) ? function1 : function2;
for (a bajillion times)
{
  function();
}

后面的代码通过预先计算要调用的函数将if移出循环,从而避免了(bajillion-1)个条件实例被评估。即使现在由于额外的间接步骤而导致实际函数调用变慢,这也可能会更快。

对于这种特定于 的情况,通过优化进行编译会删除调用,甚至会删除平方本身,因为它是编译时常量。

答案 1 :(得分:2)

除了事实,编译器内联该函数的可能性要小得多。

请注意, as-if 规则允许编译器生成代码,就像源代码是

int main()
{
    printf("5 squared is 25\n");
}

否定了一个事实,即许多优化最好留给编译器。

答案 2 :(得分:2)

是的。 函数指针的主要优点之一是运行时多态性。

您可以使用相同的函数指针指向具有相同签名的不同函数。

示例:

int (*fptr1)(int);

int square(int num) {
 return num*num;
}

int cube(int num)
{
  return num*num*num;    
}

int main()
{
  int n = 5;

 fptr1 = square;
 printf("squre = %d\n", fptr1(n));

 fptr1 = cube;
 printf("cube= %d\n", fptr1(n));

  return 0;
}

此处根据需要使fptr1指向不同的功能(squarecube)。