4

次のようなステートメントを切り替えます。

switch(x){
    case a:
         executeSth();
         executeA();
    break;
    case b:
         executeSth();
         executeB();
    break;
    ...
}

そう executeSth(); デフォルトのケースを除いて常に実行する必要がありますが、その後、ケース固有のコードが呼び出されます(executeA();またはexecuteB()など)。(そのため、スイッチの前に置くだけでは機能しません)。

「executeSth();」の数を減らす効率的な方法はありますか? パフォーマンスを犠牲にすることなく?

2 つのスイッチ (executeSth() を実行するスイッチと特定のコードを実行するスイッチ) に分割することしか想像できませんでしたが、それではパフォーマンスが犠牲になります。多分あなたはより良いアイデアを思いつきましたか?

私は基本的に c/c++ または php のコードに興味があります。私の目標は、コード サイズを最小化することです。また、c/c++ の場合は結果として得られる実行可能ファイルのサイズを小さくすることです。

編集:はい、関数の順序は重要です。Edit2: php と c++ のどちらかを選択することはできません。できるだけ良いものにする必要があります。

4

6 に答える 6

3

あなたができること (最も読みやすい解決策ではないかもしれませんが) と、PHP 5.3 以降を使用している場合は、以下のようなメソッドを作成できます。

function mymethod($funcToCall){
   executeSth();
   $funcToCall();
 }

以下のようなスイッチがあります:

switch(x){
case a:
     mymethod('executeA');
break;
case b:
     mymethod('executeB');
break;
...
}
于 2013-09-02T15:12:00.463 に答える
1

この種のものが本当に大量にない限り、私はそのままにしておきます。

もちろん、1 つの解決策は、の呼び出しを定義と定義に移動することです。executeSthこれexecuteAexecuteBもちろん、同様のコードを持つ複数の場所がある場合にのみ意味があります。複数の場所がない場合は、1 つの場所から 2 行のコードを移動したことになります。別の場所に置きます。

executeA別の解決策は、関数またはexecuteBexecuteSth引数として渡すことです。しかし、それは物事を読むのをより複雑にするだけです。

一般に、「より小さなコード」が必ずしも「より良いコード」であるとは限りません。重要なのは、コードをできるだけ明確にすることです (もちろん、妥当なパフォーマンスとコードサイズを達成しながら)。

executeSthC++ では、が小さい場合は、ケース コードにインライン化されることも期待できます。したがって、関数呼び出しが 1 つまたは 2 つある場合でも、オーバーヘッドの違いはありません。

于 2013-09-02T15:14:05.383 に答える
0

デフォルトのケースでフラグを設定し、switch ステートメントの後で、フラグが設定されていない場合 (デフォルトのケースではないことを意味します)、共通関数を実行してみませんか? それは合理的な解決策のように聞こえます。

$flag = false;
switch(x){
    case a:
         executeA();
    break;
    case b:
         executeB();
    break;
    default:
         ... // other stuff
         $flag = true;
    break;
}

if ( !$flag )
    executeSth();

編集

私は質問を誤解しました。逆の順序では、可能なケースを変数に入れてから、PHP の in_array や C++ の strstr のようなものを使用できます (より良いネイティブ関数があるかどうかはわかりません)。

if ( !in_array(x, cases) {
    executeSth();
}
switch(x){
    case a:
         executeA();
    break;
    case b:
         executeB();
    break;
    ...
}
于 2013-09-02T16:05:18.847 に答える
-1

(C++) プリプロセッサにコードを複製させますか? ( Dᴏɴ'ᴛ Uꜱᴇ Tʜɪꜱ ɪɴ Mᴀɪɴᴛᴀɪɴᴇᴅ Cᴏᴅᴇʙᴀꜱᴇ . 可読性が損なわれる可能性があります。2 スイッチ ソリューションで問題ないと思います。)

#define CASE(n) case n: printf("non-default\n"); _unused_label_##n

switch (x) {
CASE(1):
    printf("case 1\n");
    break;
CASE(2):
    printf("case 2\n");
    break;
default:
    printf("case else\n");
    break;
}

#undef CASE
于 2013-09-02T15:13:24.807 に答える