基礎知識 | 每日一練(181)
- 2019 年 11 月 26 日
- 筆記
基礎知識練習
士人有百折不回之真心,才有萬變不窮之妙用。立業建功,事事要從實地著腳,若少慕聲聞,便成偽果;講道修德,念念要從虛處立基,若稍計功效,便落塵情。 ——菜根譚
讀者:什麼是 「達夫設備」 (Duff』s Device)?
小林:這是個很棒的迂迴循環展開法。它的 「傳統」 形態, 是用來複制多個位元組:
register n = (count + 7) / 8; /* count > 0 assumed */
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);
}
這裡 count 個位元組從 from 指向的數組複製到 to 指向的記憶體地址 (這是個內
存映射的輸出暫存器, 這也是為什麼它沒有被增加)。
它把 swtich 語句和複製 8 個位元組的循環交織在一起, 從而解決了剩餘位元組的處理問題 (當 count 不是 8 的倍數時)。相信不相信, 像這樣的把 case 標誌放在嵌套在 swtich 語句內的模組中是合法的。