优化"for"循环

Optimize "for" loop

本文关键字:循环 for 优化      更新时间:2023-10-16
std::vector<int> someVector;    
for (unsigned int i = 0; i < someVector.size(); i++)
{
   // do something
}

每次都计算someVector.size()的值吗?

我已经用GCC浏览器检查过了:

代码输入:

#include<vector>
int sum(const std::vector<int> & someVector) {
  int s = 0;
  for (int i = 0; i < someVector.size(); i++) {
    s += someVector[i];
  }
  return s;
}
int main() {
  std::vector<int> someVector;
  return sum(someVector);
};

为sum()生成的程序集:

  movq  (%rdi), %rcx
  movq  8(%rdi), %rdx
  xorl  %eax, %eax
  cmpq  %rcx, %rdx
  je    .LBB0_3
  subq  %rcx, %rdx
  sarq  $2, %rdx
  xorl  %eax, %eax
  xorl  %esi, %esi
.LBB0_2:                                # =>This Inner Loop Header: Depth=1
  addl  (%rcx,%rsi,4), %eax
  incq  %rsi
  cmpq  %rdx, %rsi
  jb    .LBB0_2
.LBB0_3:                                # %._crit_edge
  ret

。大小保存在%rdx中——每次都不调用size()

正如其他人已经指出的,结果可能取决于

  • 你的编译器,
  • 优化设置和
  • 你在循环中实际做的事情(点击上面的gcc资源管理器链接可以自己尝试)。

不需要计算任何东西,整个循环就被优化了。

是否someevector .length()的值得到计算每次?

可能是,这取决于循环的内容和许多其他东西。例如,vector的大小可以在循环内部修改。然后你的编译器必须能够发现如果不是这种情况。因此,必须满足几个条件才能优化出来。

如果您要求在循环中只调用一次std::vector::size(),那么最好的(也是唯一的)策略是通过对代码进行简单的修改来完全回避这个问题:

std::vector<int> someVector;    
for (unsigned int i = 0, length = someVector.size(); i < length; ++i)
{
   // do something
}

这取决于编译器的优化。

它可能会循环优化,(如果可能的话没有提到像volatile这样的东西)

编译器将把不依赖于循环的数据(不相关的)放在外面。

那么它可能会生成类似

的内容
int length = someVector.length();
for (unsigned int i = 0; i < length; i++)
{
    // do something
}

有许多编译器优化技术,它将做。

默认情况下,c++中有一些"纯函数" string.length()总是被优化的。我不确定向量。