将元素从一个内存复制到另一个内存

时间:2013-12-08 17:38:34

标签: c optimization

我在采访中得到了这个问题,这似乎很简单,但我想证实我对其运作的理解。

f (char *p, char *q, int n)
{
    int i1 = n >> 2;
    int i2 = n & 3;

    switch (i2) 
    {
        do {
            *q++ = *p++;
            case 3:  *q++ = *p++;
            case 2:  *q++ = *p++;
            case 1:  *q++ = *p++;
            case 0:  ;
        } while (i1--);
    }
}

我在面试中被问到以下问题:

  1. 这个功能有什么作用?
  2. 为什么会有人写这么复杂的代码?
  3. 有没有办法以不同的方式写出来(更简单,更快)?
  4. 答案:

    1. 此函数复制* P所指向的内存中的元素数量* q指向的内存。

    2. 如果您将使用for循环编写它,如下所示(仅写循环)

      for(i=0;i<n;i++)
         *q++ = *p++;
      

      然后编译器在条件检查中花费更多的MIPS /时间。在这里,它将首先从n中减去i然后检查是否为非零?在给定代码中,如果i1非零,则循环维持条件仅为1条件?因此在while循环中,条件检查较少。

    3. 我们可以写成:

      f (char *p, char *q, int n)
      {
        for(i=n;i--;)
          *q++ = *p++;
      }
      

      对我而言似乎简单快捷。

    4. 请告诉我你的意见。

1 个答案:

答案 0 :(得分:1)

首先在你的回答中你似乎没有考虑n&gt;&gt; 2整数 - 在循环之前将n除以4。 然后,你不检查第二个条件,即如果n%4 == 0,则不复制该值。

  • 复制7个字节并忽略从p到q的n / 4个字节的第8个字节;
  • 这样做非常有效。使用&amp; 3而不是%4更可能快得多,并使用&gt;&gt; 2代替/ 4可能更快;唯一可能是因为编译器或c语言可能会自动为您进行优化;
  • 我会给出类似的东西

    f (char *p, char *q, int n)
    {
    int i1 = n >> 2; //i1 = n / 3;
    int i2 = n & 3;  //i2 = n & 0b111 = n % 4;
    
    for(; i1 + 1 ; --i) {
        *q++ = *p++;
        if (i2) *q++ = *p++;            
        } 
    }
    
  • 提到for循环更容易理解,就像 高效,

  • 并且更改单个if的switch语句 声明更清晰,最有可能表现相似。

  • 然后我会在结束时注意到我在按位上添加了注释 使他们的职能更加清晰的行动。