原因わかた
上の話の続き
Cを一応読めるって人向けにサンプルコード
const int DATALEN = 14; void foo(int count){ int count_l = count; //ループカウンタ用 char* str = readLine(); int offset = 0; while(count_l--){ //ここで、strのoffset〜offset+DATALENの部分をいじくる if(offset == DATALEN * 4){//五回に一回これを踏む offset = 0; str = readLine(); }else{ offset += DATALEN; } } }
これと
void foo(int count){ int count_l = count; //ループカウンタ用 char* str; int offset = 0; while(count_l--){ if(offset == 0){ str = readLine(); } //ここで、strのoffset〜offset+DATALENの部分をいじくる if(offset == DATALEN * 4){//五回に一回これを踏む offset = 0; }else{ offset += DATALEN; } } }
これで挙動が違うってのに気づけなかった
コードの怪しい部分を一応適当に解説すると、while(count_l--)のところはダウンカウンタ、count_lの回数だけループ内を実行する時に自分が勝手に使う定型文。count_lにコピーしてから使うとレジスタの関係で引数をそのまま使うより速くなる、ことが多いらしい。DATALEN*5の部分は毎回計算するの無駄だろとも感じるけどよく見ると定数式はコンパイラが事前に最適化してくれるので考えなくてよし。
で、問題はcount_lが0の時にif(offset == DATALEN*4)にひっかかったとき。つまり、countが5の倍数だったとき。前者の方が無駄に一発多くreadLine()を呼び出すことになる。
ん〜 ぬるいぞ俺