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 では、関数呼び出しを頻繁に行うと、かなりのコストがかかります。

コードサイズ、

関数のプロローグ コードとエピローグ コードの重複するオーバーヘッドがないため、関数の数が少なくなる可能性があります。

携帯性、

コードが正しく、未定義の動作に悩まされておらず、実装定義/固有の動作に依存していない限り、適用されません。

可読性

主観的かもしれません。多くの場合、抽象化レイヤーと間接参照が少ないほど、理解が容易になります。

など、?

を定義しetcます。

于 2013-04-06T22:38:31.897 に答える