這是個很棒的迂迴迴圈展開法, 由 tom duff 在 lucasfilm 時所設計。它的 ``傳統" 形態, 是用來複製多個位元組:
register n = (count + 7) / 8; /* count > 0 assumed */這裡 count 個位元組從 from 指向的陣列複製到 to 指向的記憶體位址 (這是個記憶體對映的輸出暫存器, 這也是為什麼它沒有被增加)。它把 swtich 語句和複製 8 個位元組的迴圈交織在一起, 從而解決了剩餘位元組的處理問題 (當 count 不是 8 的倍數時)。相信不相信, 象這樣的把 case 標誌放在巢狀在 swtich 語句內的模組中是合法的。當他公布這個技巧給 c 的開發者和世界時, duff 注意到 c 的 swtich 語法, 特別是 ``跌落" 行為, 一直是被爭議的, 而 ``這段**在爭論中形成了某種論據, 但我不清楚是贊成還是反對"switch (count % 8)
while (--n > 0);
}
函式包含乙個switch語句,它的case語句同時位於乙個while迴圈體內(有乙個case語句在外面)。switch內的表示式計算被八除的餘數。執行開始於while迴圈內的哪個位置由這個餘數決定,最終迴圈退出,(沒有break)。duff's device這樣就簡單漂亮地解決了邊界條件的問題。順便提一下,為什麼「case 0」標記在迴圈外面呢?這樣不是打破了對稱的美觀嗎?這樣做的唯一理由是為了處理空序列。當餘數為零,「case 0」內就需要執行乙個多餘的測試來判斷空序列的可能性。總之,這是個很酷的演算法。
達夫裝置是乙個加速迴圈語句的c編碼技巧。其基本思想是--減少迴圈測試的執行次數。
如果在乙個for迴圈中,其中操作執行得如果足夠快(比如說,乙個賦值)——那麼測試迴圈條件占用了迴圈所用時間的很大部分。迴圈應該被部分解開,這樣數個操作一次完成,測試操作也做的較少。其實,是通過switch語句將要進行的連續迴圈操作的次數進行了預判(根據擦case語句的位置)然後依次執行,而不必每次都去進行測試條件。
在這裡duff's device是個新穎的,有創造力的解決方案。這裡有乙個使用該模型的乙個例項:快速拷貝和填充。
duff's device對效率的負面影響可能來自於**膨脹(一些處理器更善於處理緊湊的迴圈而不是大的迴圈)和特別的結構。優化器被做成當遇一些更加技巧性的結構時可能會不知所措從而生成比較保守的**。
除了這個一般形態,以下給出乙個簡化形態,可以幫助理解。迴圈列印n個星號* (來自steve』s 『cute code』 collection):
達夫裝置 Duff s Device
今天遇到乙個非常詭異的 不多說直接上 void duffdev char to,char from,int count while n 0 void normalcopy char to,char from,int count while count 0 我第一眼看到這個 很懵。不知道是什麼意思。s...
達夫裝置(Duff s Device)
達夫裝置裝置是一段非常巧妙,看起來非常詭異的c 它可以很大的提高程式執行的效率 本文將試驗 達夫裝置的 我就不說了,我們來分析一下。達夫裝置是考慮到我們一般用for或者while迴圈的時候,如果執行迴圈內容本身用不了多少時間,那麼時間將被主要消耗在每次迴圈的比較語句上邊。事實上比較語句是有很大優化空...
關於達夫裝置(Duff s device)的理解
register n count 7 8 count 0assumed switch count 8 while n 0 剛開始看了半天也沒搞清楚這段 是怎麼執行的,就上網查了查也沒搞很明白,於是就寫了一小 測試了下,總算是弄明白了。這段程式的主體是do while而非switch case,理解這...