可能重复:
What does this C code do [Duff's device]?
How does Duff's device work?
void duff(register char *to, register char *from, register int count)
{
register int n=(count+7)/8;
switch(count%8)
{
case 0:
do{
*to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
}while( --n >0);
}
}
以上是否有效的C代码?如果是这样,它试图实现什么,为什么有人会像上面这样做?
答案 0 :(得分:8)
是的,它被称为Duff's Device。
答案 1 :(得分:4)
是的,它是有效的C代码。从一个指针(从)到另一个指针(to)复制正确的字节数(计数)是一个聪明的优化。 switch语句在案例中使用了fall through,因此case 7:
将复制一个字节,然后转到case 6:
。最终,所有内容都会通过正确数量的复制指令,从而导致复制的字节数正确。这样可以在大多数机器上紧密包装生成的装配说明,并且通常可以提高性能。
答案 2 :(得分:1)
代码是正确的,它被称为Duff的设备。
我认为了解此代码如何工作的最佳方法是 要了解switch的工作,我建议使用以下代码: 看看“case x:”只是简单的标签
void duff(register char *to, register char *from, register int count)
{
register int n=(count+7)/8;
// replace switch with this lines
if (count % 8 == 7) goto case 7;
if (count % 8 == 6) goto case 6;
if (count % 8 == 5) goto case 5;
if (count % 8 == 4) goto case 4;
if (count % 8 == 3) goto case 3;
if (count % 8 == 2) goto case 2;
if (count % 8 == 1) goto case 1;
if (count % 8 == 0) goto case 0;
case 0:
do{
*to++ = *from++;
case 7: *to++ = *from++;
case 6: *to++ = *from++;
case 5: *to++ = *from++;
case 4: *to++ = *from++;
case 3: *to++ = *from++;
case 2: *to++ = *from++;
case 1: *to++ = *from++;
}while( --n >0);
}
我建议访问此链接How does Duff's device work?
抱歉我的英文