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

在C中使用函数指针有效吗?,c,function-pointers,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; } 除了编译器内联函数的可能性要小得多这一事实之外,没有 注意,as-if规则允许编译器生成代码,就像源代码是 int

函数指针是否影响程序的运行时间

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

除了编译器内联函数的可能性要小得多这一事实之外,没有

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

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

总结了许多优化最好留给编译器的事实。

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

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

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

这是一个事实的缩影,许多优化最好由编译器来完成。

这有点难以回答,因为它的级别非常低,通常可以归结为“视情况而定”

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

例如,考虑:

for (a bajillion)
{
  if (something complex)
  {
    function1();
  }
  else
  {
    function2();
  }
}
这将使复杂的
if
a bajillion倍,当然这将花费很多。这可以使用函数指针进行重构:

const void (*function)(void) = (something complex) ? function1 : function2;
for (a bajillion times)
{
  function();
}
后一个代码通过预先计算要调用的函数,将
if
移出循环,从而保存(bajillion-1)从未被计算过的条件实例。这可以更快,即使由于额外的间接步骤,现在实际的函数调用速度较慢


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

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

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

例如,考虑:

for (a bajillion)
{
  if (something complex)
  {
    function1();
  }
  else
  {
    function2();
  }
}
这将使复杂的
if
a bajillion倍,当然这将花费很多。这可以使用函数指针进行重构:

const void (*function)(void) = (something complex) ? function1 : function2;
for (a bajillion times)
{
  function();
}
后一个代码通过预先计算要调用的函数,将
if
移出循环,从而保存(bajillion-1)从未被计算过的条件实例。这可以更快,即使由于额外的间接步骤,现在实际的函数调用速度较慢

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

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

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

例如:

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
指向不同的功能(
square
cube
)。 函数指针的主要优点之一是运行时多态性

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

例如:

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

此处根据需要指定了不同的函数(
square
cube
)。

您可以看看这个问题:您可以看看这个问题:在这种情况下?似乎足够让人觉得@StoryTeller:Wow,回到原稿中。在这种情况下?似乎已经够难理解了@StoryTeller:哇,那就回到原稿吧。