4

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

现在的问题是,在效率、代码大小、可移植性、可读性等方面,“函数指针”方法与“简单标志方法”的(ad/disad)优势是什么?

4

2 回答 2

1

就效率而言,“函数指针”方法与“简单标志方法”的(广告/不利)优势是什么,

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

代码大小,

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

可移植性,

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

可读性

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

ETC。, ?

定义etc.

于 2013-04-06T22:38:31.897 回答
0

当您想添加新操作时怎么办?

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

于 2013-04-06T23:31:14.100 回答