C++第3版 | spin on the RITZ

C++第3版

分厚い。重い。


練習問題にあったソース


void send(int* to, int *from, int count)
{
    int n = (count+7) / 8;
    switch (count%8) {
    case 0: do {    *to++ = *from++;
    case 7:         *to++ = *from++;
    case 6:         *to++ = *from++;
    case 5:         *to++ = *from++;
    case 4:         *to++ = *from++;
    case 3:         *to++ = *from++;
    case 2:         *to++ = *from++;
    case 1:         *to++ = *from++;
        } while (--n > 0);
    }
}


なにをしてるでしょうか?って、fromからtoにcountだけデータをコピーしてるんだね


さて、「このようなものを書く理由はどのようなものか?」という質問があるわけですよ。

ぶっちゃけもっと簡単にかけるし、わっかんないなーなんて思ったからネットで調べました。


どうやら初めの8の除算などで、変数の減算と比較を1/8にしているそうです。

じゃあ速くなったのか!?と思って自分の書いた簡単なsend関数をつかった実測をしてみるわけなのですよ


void my_send(int* to, int *from, int count)
{
    while (count-- > 0)
        *to++ = *from++;
}



結果!



あんまり変わらない!(むしろ遅いときもある)



ダメじゃーん!




でもswitchの中であんな風にdo whileを使うのは初めてみた。

面白いアイディアだと思うw

理解できたときは『うおっ!スゲー!』って思いました