【问题标题】:Is it effective to use function pointers in C? [duplicate]在C中使用函数指针是否有效? [复制]
【发布时间】:2019-04-02 05:59:59
【问题描述】:

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

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;
}

【问题讨论】:

标签: c function-pointers


【解决方案1】:

除了编译器内联函数的可能性要小得多之外,不会。

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

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

体现了许多优化最好留给编译器这一事实。

【讨论】:

  • 这个的情况下?似乎足够内联godbolt.org/z/V3aS27
  • @StoryTeller:哇,那么回到原来的草稿。
【解决方案2】:

这有点难以回答,因为它的级别非常低,通常归结为“取决于”。

一般来说,假设函数指针被实际使用,我希望它有一个成本,因为它是一个额外的步骤。与跳转到加载时已知的恒定位置相比,加载变量的值然后跳转到那里是有区别的。由于缓存的原因,该成本可能会随着程序的执行而变化,但它可能永远不会为零。当然,使用函数指针也可以让代码的结构整体上更快,所以它仍然是积极的。

例如,考虑:

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

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

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

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

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

【讨论】:

    【解决方案3】:

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

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

    例子:

    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)。

    【讨论】:

      猜你喜欢
      • 2011-04-07
      • 2021-11-14
      • 2017-02-09
      • 1970-01-01
      • 2010-11-02
      • 2020-03-22
      • 2014-10-19
      • 1970-01-01
      • 2016-08-14
      相关资源
      最近更新 更多