1

以下の「C」コード スニペットから、どちらがより効率的か (1 または 2)、なぜですか? これに光を当ててください。前もって感謝します!

//I am doing some operation with this macro.
 #define ERRMAP( sts ) ((A_AB( sts ) < FIRST_ERR) ? \
                         sts : \
                         ((A_AB( sts ) > A_AB( LAST_ERR )) ? \
                         sts : \
                         sts_to_errno_m[A_AB( sts ) - FIRST_ERR]))


    //Code snippet 1
       int some_fun (int sts) {

               int i = ERRMAP( sts );
               printf(" sts = %d", i);
               return i;
        }


    //Code snippet 2
        int some_fun (int sts) {

               printf(" sts = %d", ERRMAP( sts ));
               return (ERRMAP( sts ));
        }
4

3 に答える 3

1

おそらくA_ABSマクロのような機能も!基本的なトリックは、頭の中でそれを疑似マシンコードに変換することです-それA_ABSは同様の複雑さを持ち、それ以上のものを呼び出さないとしましょう-次に、それらのそれぞれを約20のopコードに配置し、合計で40になります-それらを使用して値に割り当て、その値を2回使用すると42になります.2回「呼び出す」と80になるので、それを解決します。

ところで、関数を使用しようとしたときに、コードが大きすぎるか遅すぎる主な理由の 1 つであるとプロファイラーが判断した場合にのみ、この種のマクロ (つまり、関数のようなもの) を実行することを検討する必要があります。理由:

  1. マクロのエラーは、コンパイラがその場所を報告するのが困難です。最大 80 文字の 5 行がありますが、コードを「呼び出す」場所でコンパイラ エラーが報告されるだけです。
  2. C/C++ の主な利点の 1 つである型チェックを無効にしています。
  3. マクロをステップ実行できないため、マシン コード以外のデバッグは不可能です。
  4. メンテナンスの悪夢です。
  5. コンパイラ オプティマイザーは、多くの場合、うまく機能しません。
  6. コード チェッカーがマクロでうまく機能しない
  7. MISRA およびその他のコンパイル チェッカーは、コードに失敗します。
  8. 通常は不要です!
于 2013-09-06T05:19:57.453 に答える
1

これをしないでください:

int some_fun (int sts) {
    printf(" sts = %d", ERRMAP( sts ));
    return (ERRMAP( sts ));
}

いつの日か、ERRMAP が副作用を持つように変更された場合、出力されたものと返されたものとの間で異なる結果が得られるでしょう。

また、一度計算を行うことをお勧めします。ERRMAP が関数であるかマクロであるかにかかわらず、これが最善です。int i = ERRMAP( sts );

于 2013-09-06T04:51:16.823 に答える