看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《FRAXIS (喔喔)》之銘言: : 不過Duff's device的技巧就是可以把這兩個迴圈融合在一起。 : i = 0; : switch ( n % 5 ) { : case 0: do {sum += a[ i++ ]; : case 1: sum += a[ i++ ]; : case 2: sum += a[ i++ ]; : case 3: sum += a[ i++ ]; : case 4: sum += a[ i++ ]; : } while ((n -= 5) > 0); : } 假設 n = 6,則 n % 5 是 1 所以第一次 loop 會加 a[0]~a[3] 4 個數 (case 1 ~ case 4) 第二次 loop 又加了 a[4]~a[8] 5 個數 這樣總共就加了 a[0]~a[8] 9 個數了 所以 case 那裡應該要反過來排才是對的 switch ( n % 5 ) { case 0: do {sum += a[ i++ ]; case 4: sum += a[ i++ ]; case 3: sum += a[ i++ ]; case 2: sum += a[ i++ ]; case 1: sum += a[ i++ ]; } while ((n -= 5) > 0); } -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.30.49 ※ 編輯: HuangTzHuan 來自: 140.112.30.49 (06/29 00:43)
avhacker:現在 compiler 很威的,還會辨識出不好的 unrolling 06/29 00:49
FRAXIS:筆誤了..謝謝 06/29 07:59