達夫裝置 Duff s Device

2021-07-31 13:14:23 字數 1219 閱讀 5978

今天遇到乙個非常詭異的**。不多說直接上**。

void duffdev(char *to, char *from, int count)

while (--n > 0); }}

void normalcopy(char *to,char* from,int count)

while (--count>0);

}

我第一眼看到這個**很懵。不知道是什麼意思。switch case 和 do  while柔和在一起居然也不報錯而且效率挺高。於是我在網上查詢資料。才看到下面這段。

那段**的主體還是do-while迴圈,但這個迴圈的入口點並不一定是在do那裡,而是由這個switch語句根據n,把迴圈的 入口定在了幾個case標號那裡。也就是說,程式的執行流程是:程式一開始順序執行,當它執行到了switch的時候,就會根據n的值,直接跳轉到 case n那裡(從此,這個swicth語句就再也沒有用了)。程式繼續順序執行,再當它執行到while那裡時,就會判斷迴圈條件。若為真,則while迴圈開 始,程式跳轉到do那裡開始執行迴圈(這時候由於已經沒有了switch,所以後面的標號就變成普通標號了,即在沒有goto語句的情況下就可以忽略掉這 些標號了);為假,則退出迴圈,即程式中止。

duff』s device,是用tom duff的名字來命名的。很有名的乙個東西,用來優化拷貝的,據說和rob pike此牛還有點兒關係~!不過注意,原始的duff』s device中的to可是不變的,因為它指向乙個對映到記憶體的暫存器。

這是個很棒的迂迴迴圈展開法, 由 tom duff 在 lucasfilm 時所設計。它的 ``傳統" 形態, 是用來複製多個位元組: 

register n = (count + 7) / 8;   /* count > 0 assumed */

switch (count % 8)

while (--n > 0);

}這裡 count 個位元組從 from 指向的陣列複製到 to 指向的記憶體位址 (這是個記憶體對映的輸出暫存器, 這也是為什麼它沒有被增加)。它把  swtich 語句和複製 8 個位元組的迴圈交織在一起, 從而解決了剩餘位元組的處理問題 (當 count 不是 8 的倍數時)。相信不相信, 象這樣的把  case 標誌放在巢狀在 swtich 語句內的模組中是合法的。當他公布這個技巧給 c 的開發者和世界時, duff 注意到 c 的 swtich  語法, 特別是 ``跌落" 行為, 一直是被爭議的, 而 ``這段**在爭論中形成了某種論據, 但我不清楚是贊成還是反對"。

Duff s Device 達夫裝置

這是個很棒的迂迴迴圈展開法,由 tom duff 在 lucasfilm 時所設計。它的 傳統 形態,是用來複製多個位元組 register n count 7 8 count 0 assumed switch count 8 while n 0 這裡 count 個位元組從 from 指向的陣列複...

達夫裝置(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,理解這...