【问题标题】:Advantage of function pointers over flags [closed]函数指针相对于标志的优势[关闭]
【发布时间】:2013-04-06 18:05:44
【问题描述】:

例如,我有一个名为 int compute (int x1, int x2, int (* op) (int, int) ) 的函数,它以函数指针为参数到一个做一些算术运算的函数

int add (int a1, int a2)
{
    return (a1 + a2);
}
int mul (int s1, int s2)
{
    return (s1 * s2);
}
int compute (int x1, int x2, int (* op) (int, int) )
{
    return ( op (x1, x2) );
}
main()
{
    int result;
    int op1, op2;
    op1 = 4;
    op2 = 5;
    result = compute (op1, op2, &add());
    result = compute (op1, op2, &mul());
}

除了所有这些函数指针的东西,我也可以使用标志作为参数而不是函数指针来实现相同的目的。

int compute (int x1, int x2, int opFlag)
{
    if ( opFlag == 1 )
        return ( add (x1, x2); );
    if ( opFlag == 2)
        return ( mul (x1, x2); );
    return 1;
}

main()
{
    int result;
    int op1, int op2;

    op1 = 4;
    op2 = 5;

    result = compute (op1, op2, 1);
    result = compute (op1, op2, 2);
}

现在的问题是,“函数指针”方法与“简单标志方法”在效率、代码方面的(广告/不利)优势是什么?尺寸、便携性、可读性等,?

【问题讨论】:

  • 如果您使用标志并且想要添加更多功能,则必须编辑代码以添加更多if 子句。
  • 有了函数指针,可以在不改变或重新编译compute的情况下传递其他算法。
  • 您可以通过函数指针获得可重用性。 Compute( ) 可以放在库中并分发给其他用户,无需更新即可支持新操作。
  • 您是在一般情况下还是在这种特殊情况下询问?一般来说,您将如何使用标志实现 qsort 或 bsearch 之类的东西?
  • result = compute (op1, op2, &add()); 行包含错误,不应编译(gcc 表示erreur: lvalue required as unary ‘&’ operand。该行应为result = compute (op1, op2, add);,根据需要获取add() 的地址..

标签: c callback function-pointers


【解决方案1】:

在效率方面,“函数指针”方法与“简单标志方法”的(ad/disad)优势是什么,

更少的调用可能会更快。在许多 CPU 上,当您执行大量函数调用时,它们的成本会很高。

代码大小,

更少的函数可能更小,因为您没有函数 prolog 和 epilog 代码的重复开销。

便携性,

只要您的代码正确、不存在未定义行为且不依赖于实现定义/特定行为,则不适用。

可读性

可能是主观的。通常,更少的抽象层和更少的间接层比更多的更容易理解。

等等,?

定义etc。

【讨论】:

    【解决方案2】:

    当你想添加一个新的操作怎么办?

    函数指针让您(或您的库的未来客户)在不更改计算函数的情况下做到这一点

    【讨论】:

      猜你喜欢
      • 2010-11-13
      • 2010-09-17
      • 1970-01-01
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 2013-05-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多