【问题标题】:Copy elements from one memory to other [duplicate]将元素从一个内存复制到另一个[重复]
【发布时间】:2023-04-07 21:52:01
【问题描述】:

我在面试中得到了这个问题,看起来很简单,但我想确认一下我对它的功能的理解。

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. 有没有什么不同的写法(更简单、更快)?

给出的答案:

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

  2. 如果你会用下面的for循环编写它(只写循环)

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

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

  3. 我们可以写成:

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

    对我来说,这似乎既简单又快捷。

请给我你的意见。

【问题讨论】:

  • 一个好建议 - 在您在此处发布代码之前,将其写入您计算机上的文本编辑器中,然后将其复制到您的问题中。这样你就可以注意到一些类型,并得到正确的缩进。
  • 看起来有人错误地编辑了您的代码?它应该是 do{switch(){..};}while();

标签: c optimization


【解决方案1】:

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

  • 从 p 到 q 复制 7 个字节并忽略第 n/4 个字节的第 8 个字节;
  • 它的工作效率很高。使用 &3 代替 %4 很可能快得多,使用 >> 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 循环更容易理解,就像 高效,

  • 以及将 switch 语句更改为单个 if 语句更清晰,并且最有可能具有类似的性能。

  • 然后我会指出我在按位上添加了 cmets 操作,使其功能更清晰。

【讨论】:

    猜你喜欢
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2011-05-28
    相关资源
    最近更新 更多