しつこく apply
フラグが多くて組合せが爆発するよぉ…
現在、引数の組合せが実に 32 種類! アセンブラみたいにちょこちょこ臨機応変に積んでから call なんてことはできないから、これだけの呼び出しを全部書き下す必要がある。何かを間違えてる。絶対。
自由度高くしすぎかな。(顔
しかしコンパイルすると、ざっぱりまとめて最適化してくれるんだろうか。むしろ C の引数受け渡し規約を利用して、必要ないのまで必ず積むとかやりそう。
つまり
switch (flag) { case A0: func (b, c); break; case B0: func (b); break; case C0: func (); break; case A1: func (a[0], b, c); break; case B1: func (a[0], b); break; case C1: func (a[0]); break; ... }
というのを
switch (flag) { case A0: case B0: case C0: func (b, c); break; case A1: case B1: case C1: func (a[0], b, c); ... }
としてコンパイルする感じ。
GCC はそれはやってくれませんでした。もうちょっと素直に push が並んでる中にジャンプするコード吐きました。-O2 でも -O3 でも -Os でも。ていうか -Os のコードの方が -O3 のより速そうなんですけど?
うぐぅ、また詰まった。必須引数を配列として渡せば組合せが激減 (1/4) するけど、そうするとレジスタ渡しが基本の CPU での performance が心配。あと受け取る側が面倒。
痒くなくなったし、寝よ。