【问题标题】:How to write optimized logic in C to reduce loop?如何在 C 中编写优化逻辑以减少循环?
【发布时间】:2020-09-20 04:10:32
【问题描述】:

我有以下代码sn-p,

int main()
{
    int loop;
    
    char * src = 0x20000000;
    char * dest = 0x20000008;

    for(loop = 0; loop < 8; loop++)
       dest [loop] = src [loop];
}

这是一个有效的代码吗?如何优化逻辑以减少循环?

【问题讨论】:

  • 通常最好的方法是直接调用memcpy,它已经被比我们任何人聪明得多的人优化了:-)
  • 你有没有用你的编译器试过它,看看它对这个char * src = 0x20000000; 说了什么?在担心循环逻辑之前先这样做。
  • 一个非常宽松但优化的编译器将被允许用int main() { return 0; } 替换整个代码,这在性能方面很难超越 ;-)
  • 欢迎来到 SO!具体到以上几点,warning: initialization makes pointer from integer without a cast char * src = 0x20000000;。这里的代码有什么意义?
  • 你确定0x20000000是一个有效地址吗?在我的Debian x86-64桌面上,不是, 因为ASLR。考虑阅读Modern C,然后阅读您的 C 编译器(例如 GCC..)、调试器(例如 GDB、...)的文档,也许还有您的操作系统...

标签: c pointers memory


【解决方案1】:

假设编译器不会自动执行此操作,如果有几个假设,则可以对其进行优化:

  • char 的大小为 1 个字节
  • CPU 指令集支持 8 字节操作(对于非 64 位平台,实现可能会有所不同)
  1. 将源地址和目标地址转换(或直接定义)为unsigned long long*

  2. 执行从源到目标的直接分配。如果平台指令集支持 64 位操作,则应将 64 位数据块从源复制到目标。例如,在 Intel CPU 上,它可以通过一条 movsq 汇编指令来完成。

    int main()
    {
         unsigned long long * src = 0x20000000;
         unsigned long long * dest = 0x20000008;
    
         *dest = *src;
    
         return 0;
     }
    

【讨论】:

    【解决方案2】:

    这是一个有效的代码吗?

    您可以使用您的编译器来找出答案。特别是循环部分是有效代码,我想这就是您真正要问的。

    如何优化逻辑以减少循环?

    在您的编译器中打开优化,它会处理其余的事情。从性能的角度来看,没有办法改进该代码,尽管您可以使用 memcpy() 使代码更简洁、更易于阅读。

    【讨论】:

      猜你喜欢
      • 2011-10-29
      • 1970-01-01
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多