本来のバージョン
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2016/04/02 13:39 UTC 版)
「Duff's device」の記事における「本来のバージョン」の解説
連続コピーを普通にコーディングすると以下のようになる。 do { /* count > 0 と仮定 */ *to = *from++; /* ''to'' はインクリメントされていない */} while (--count > 0); ダフの本来の意図はメモリマップされた周辺機器の出力レジスタへのコピーだったため、to がインクリメントされていない。 これを最適化するにあたり、ダフは、switch 文と do ループを組み合わせた構造によってループ展開ができると気づいた。 send(to, from, count)register short *to, *from;register count;{register 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);}} Duff's device は、8に限らずどのようなサイズのループ展開にも応用可能である。
※この「本来のバージョン」の解説は、「Duff's device」の解説の一部です。
「本来のバージョン」を含む「Duff's device」の記事については、「Duff's device」の概要を参照ください。
- 本来のバージョンのページへのリンク