优化“for”循环

时间:2013-05-25 06:24:44

标签: c++ optimization

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

someVector.size()的值是否每次计算

3 个答案:

答案 0 :(得分:5)

我已与GCC explorer核实:

输入的代码:

#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 explorer链接尝试自己)。

不计算任何东西,整个循环就会被优化掉。

答案 1 :(得分:4)

  

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

可能,取决于循环内容和许多其他内容。例如,可以在循环内修改向量的大小。然后你的编译器必须能够发现是不是这种情况。因此,必须满足一些条件才能进行优化。

如果您要求std::vector::size()仅在循环中调用一次,那么最好(也是唯一)的策略是完全通过对代码的微不足道的修改来回避问题:

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

答案 2 :(得分:0)

这取决于编译器优化。

它可能是循环优化,(如果可能的话,没有提到类似易失性的东西)

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

所以它可能会产生类似

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

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

默认情况下,在c ++中有一些“纯函数” string.length(),它总是被优化。我不确定vector.size是否属于那个。