しつこく 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 が心配。あと受け取る側が面倒。

痒くなくなったし、寝よ。