// 当然,如果还不懂的话,我们可以这样理解
void fastcopy(BYTE *pdest, BYTE *psrc, long count)
{
int n;
int m;
m = count % 8;
if (m == 0) goto jump0;
else if (m == 1) goto jump1;
else if (m == 2) goto jump2;
else if (m == 3) goto jump3;
else if (m == 4) goto jump4;
else if (m == 5) goto jump5;
else if (m == 6) goto jump6;
else if (m == 7) goto jump7;
n = (count + 7) / 8;
do
{
jump0:
*pdest++ = *psrc++;
jump7:
*pdest++ = *psrc++;
jump6:
*pdest++ = *psrc++;
jump5:
*pdest++ = *psrc++;
jump4:
*pdest++ = *psrc++;
jump3:
*pdest++ = *psrc++;
jump2:
*pdest++ = *psrc++;
jump1:
*pdest++ = *psrc++;
} while (--n > 0);
}
如果不考虑代码的效率,而仅从功能的角度上讲,这里的一组 if 语句,与 Duff's Device 中的 switch 语句具有相同的功能。如果考虑编译器的优化,那么 Duff's Device 的效率会更加高一些。然而,在实际中,是不存在理想化的 switch 语句的,所谓的跳准表优化,其实是很难用到 switch 语句上的,switch 的是一个 int 型的整数,如果使用直接的跳转表,在极端情况下编译器有可能需要为一个 switch 语句去维护一个拥有 4G 个表项的直接跳转表,这显然是无法做到的。因此,编译器会采用维护间接跳转表来达到目的,不管何种形式的间接跳转表,消耗在查表上的开销,也很难说就比 if 语句来得少。聪明的编译器,也许会根据 switch 中 case 语句的情况,来采取不同的跳转表策略,并产生优化的代码。而另外一些编译器,则干脆就简单的将 switch 语句编译成为与 if 语句组等同的代码。