Anyone know why Duff's device is usually written like this:
Expand|Select|Wrap|Line Numbers
- void duff(const char *str, int len) {
- int n = (len + 7) / 8;
- switch (len % 8) {
- case 0: do{ foo(*str++);
- case 7: foo(*str++);
- case 6: foo(*str++);
- ...
- case 1: foo(*str++);
- } while (--n 0);
- }
- }
Expand|Select|Wrap|Line Numbers
- void duff2(const char *str, int len) {
- switch (len % 8) {
- case 0: while ((len -= 8) >= 0) {
- foo(*str++);
- case 7: foo(*str++);
- case 6: foo(*str++);
- ...
- case 1: foo(*str++);
- }
- }
- }
Nor does it need the divide by 8, though I realize n-=1
may be cheaper than n-=8 on some architectures.
People have had 18 years to notice now:-)
--
Hallvard