コンパイラが一連としてこれをコンパイルすることができる
#define FIVE_CHARS(c1,c2,c3,c4,c5) (((((((((c5)<<7)|(c4))<<6)|(c3))<<6)|(c2))<<6)|(c1))
while (argc-->0){
switch (FIVE_CHARS(argv[argc][0],argv[argc][1],argv[argc][2],argv[argc][3],argv[argc][4])){
case FIVE_CHARS('-','h','e','l','p') :
case FIVE_CHARS('-','-','h','e','l') :
case FIVE_CHARS('-','h','\0','\0','\0') :
case FIVE_CHARS('-','?','\0','\0','\0') :
usage();
break;
case FIVE_CHARS('-','a','r','g','1') :
setflag1();
break;
default:
assert("Argument not supported");
}
}
マクロとスイッチケースシフトがない「場合は、」(文字列)文字列の等価ではないが、それはビットを使用してある程度達成することができます小さい数の比較を持つifまたは大きい数のジャンプテーブルを使用します。これは、ビットシフトの大部分(ケースステートメント内のもの)が実行時ではなくコンパイル時に行われ、残りのビットシフト操作(スイッチ内のもの)が比較的安価であるため、コードサイズと速度の両方が大幅に向上します。 (最も一般的なパスを最初に置く必要がなくなります)... 5文字が一致する場合、珍しい文字/文字に対して余分なスイッチケースを追加するか、単にstrcmp()を使用することができます。 strcmp(){} else if if strcmp(){} else if ...
私は実際にサフィックスの統合について考えています。結果のコードにツリーを '入れます。これによって、実際の接尾辞ツリーは構築されませんが、命令シーケンスは接尾辞ツリー内の検索のように機能します。この最適化は非常に最適です(おそらく死んだパスの削除でより多くの場合)。コストはO(n)です。ここでnは変数の文字列の長さです。 – LeleDumbo
@LeleDumboこれは実際に私が考えていたものですが、実行時にデータセット全体を知っていることを考慮すると、非常に効率的な検索アルゴリズムを作成できない理由はありません。 – Sparafusile