C言語なら俺に聞け! Part 88
■ このスレッドは過去ログ倉庫に格納されています
0223デフォルトの名無しさん
NGNGアセンブラ出力をみると、結局if-elseと変わらなかったり。
(まあ、両方定数だからjmpなしのコードに最適化されるかもしれないけど)
普通にifを使って(elseをなくす)書いた方が良い時も多々。
で、まあ、俺なら条件(0/1)に対応したテーブルを使うかな。
cmov使わないコンパイラでも、setccは使うからね。
メモリ参照になるけど、キャッシュに入っていれば分岐よりずっとマシだし。
こんな感じで。
#define maskshift(n) (((1<<8)-1) << (n))
static unsinged t24[] = { 0, maskshift(24), };
static unsinged t16[] = { 0, maskshift(16), };
static unsinged t08[] = { 0, maskshift(8), };
static unsinged t00[] = { 0, maskshift(0), };
mask = 0;
mask |= t24[(data & maskshift(24)) != 0];
mask |= t16[(data & maskshift(16)) != 0];
mask |= t08[(data & maskshift(8)) != 0];
mask |= t00[(data & maskshift(0)) != 0];
■ このスレッドは過去ログ倉庫に格納されています