功能指针优于标志

时间:2013-04-06 18:05:44

标签: c callback function-pointers

让我们说,例如,我有一个名为 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());
}

而不是所有这个函数指针的东西,我也可以使用flags作为参数而不是函数指针来实现相同的。

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

现在的问题是,在效率,代码方面,“功能指针”方法与“简单标记方法”的(ad / disad)优势是什么?尺寸,便携性,可读性等,?

2 个答案:

答案 0 :(得分:1)

  

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

更少的通话可能会更快。在许多CPU上,当您执行大量操作时,函数调用会产生显着的成本。

  

代码大小,

由于没有函数prolog和epilog代码的重复开销,因此较少的函数可能会更小。

  

便携性,

只要您的代码正确,不会受到未定义的行为影响并且不依赖于实现定义/特定行为,则不适用。

  

可读性

可能是主观的。通常情况下,抽象层次更少,间接更少,更容易理解。

  

等,?

定义etc

答案 1 :(得分:0)

当你想要添加新操作时呢?

函数指针允许您(或您的库未来客户)在不更改计算功能的情况下执行此操作