基礎知識 | 每日一練(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 語句內的模組中是合法的。