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

Emi*_*nli 1 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;
}
Run Code Online (Sandbox Code Playgroud)

unw*_*ind 5

这有点难以回答,因为它的水平非常低,而且通常归结为"它取决于".

一般来说,假设实际使用了函数指针,我希望它有一个成本,因为它是一个额外的步骤.与跳转到加载时已知的恒定位置相比,加载变量的值然后跳转到那里之间存在差异.由于缓存,该成本可能会因程序的执行而有所不同,但可能永远不会为零.同样使用函数指针当然可以允许代码以一种使整体更快的方式构造,因此它仍然可以是正面的.

例如,考虑:

for (a bajillion)
{
  if (something complex)
  {
    function1();
  }
  else
  {
    function2();
  }
}
Run Code Online (Sandbox Code Playgroud)

这个复杂if的事情要花费数百倍,这当然会花费很多.这可以使用函数指针重构:

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

后一个代码if通过预先计算调用哪个函数来移出循环,从而节省了(一个bajillion-1)条件实例的评估.即使现在的实际函数调用由于额外的间接步骤而变慢,这也会更快.

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