Skip to content

一種巧妙及噁心並具的 C 語言寫法:達夫裝置 (Duff's device)

發佈

達夫裝置(Duff’s device) 是一種用來進行複製的特殊寫法,它非常巧妙地運用 C 語言 switch-case 的特性來達成,但這種寫法真的滿噁心的(連作者自己也使用 Disgusting 來描述)。

之所以會寫得這麼特別,主要是要處理 count 不能被 8 整除的情況。

它最初被用來改善運行速度,雖然在現代,編譯器最佳化後普通寫法的效能可以輕鬆達到並超越這種寫法,所以我們確實不用再實際用到這種寫法了。

更何況 memcpy() 比它好看太多了,而且各個平台和編譯器可能會對它有額外的最佳化,但我覺得 Duff’s device 還是相當值得看看。

// Duff's device
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);
    }
}

看!我第一次知道 case 可以打破並穿插在同一個 block 之間,在裡面像 goto 一樣跳轉。

參考


Blog 新樣式:Fluid,以及歷史回顧
在 NeoVim 中使用 Flash 取代 Easy Motion 來快速跳轉

留言可能不會立即顯示。若過了幾天仍未出現,請 Email 聯繫:)