代码之家  ›  专栏  ›  技术社区  ›  Daniel Langr

只有当循环中更新的变量是局部变量时,才能优化计算。

  •  5
  • Daniel Langr  · 技术社区  · 6 年前

    对于以下函数,优化后的代码是矢量化的,计算在寄存器中执行(返回值返回到 eax )生成的机器代码如下: https://godbolt.org/z/VQEBV4 .

    int sum(int *arr, int n) {
      int ret = 0;
      for (int i = 0; i < n; i++)
        ret += arr[i];
      return ret;
    }
    

    但是,如果我 ret 变量全局(或类型的参数 int& )未使用矢量化,编译器存储更新的 雷特 在每次迭代到内存中。机器代码: https://godbolt.org/z/NAmX4t .

    int ret = 0;
    
    int sum(int *arr, int n) {
      for (int i = 0; i < n; i++)
        ret += arr[i];
      return ret;
    }
    

    我不明白为什么在后一种情况下会阻止优化(寄存器中的矢量化/计算)。没有线程,即使增量也不会自动执行。而且,这种行为在编译器(gcc、clang、intel)中似乎是一致的,所以我相信一定有原因。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Jarod42    6 年前

    如果 ret 不是本地而是全球, arr 可能别名 雷特 减少优化机会。