以上是有效的C代码吗?如果是这样,它想要实现什么,为什么有人会像上面这样做?

时间:2011-05-26 15:17:38

标签: c

  

可能重复:
  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代码?如果是这样,它试图实现什么,为什么有人会像上面这样做?

3 个答案:

答案 0 :(得分:8)

是的,它被称为Duff's Device

答案 1 :(得分:4)

是的,它是有效的C代码。从一个指针(从)到另一个指针(to)复制正确的字节数(计数)是一个聪明的优化。 switch语句在案例中使用了fall through,因此case 7:将复制一个字节,然后转到case 6:。最终,所有内容都会通过正确数量的复制指令,从而导致复制的字节数正确。这样可以在大多数机器上紧密包装生成的装配说明,并且通常可以提高性能。

You can read more about duff's device here.

答案 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?

抱歉我的英文