简单的循环C ++为什么

时间:2015-04-13 19:48:23

标签: c++ for-loop

我只是想知道为什么我会在c ++中这样做

for(int i=0, n=something.size(); i<n; ++i) 

VS

for(int i=0; i<something.size(); ++i)      

...

4 个答案:

答案 0 :(得分:5)

假设两个样本的语法正确版本,如果对something.size()的调用很昂贵,则第一个样本可能更有效,因为它为每个循环迭代保存一个调用。即便如此,你应该衡量它是否真的有所作为。

请注意,如果something的大小在循环内部发生变化,则两者将具有不同的语义。

答案 1 :(得分:2)

每个循环之前评估循环条件,所以如果比较的操作数没有改变(即你在迭代过程中不改变序列),那么你不需要每次都重新计算操作数,而是将其提升出来。

这是否有所不同取决于编译器可以看到size()调用的程度。例如,如果它可以证明结果在迭代期间不能改变,那么它可能已经为您提升了。如有疑问,请编译两个版本并比较机器代码。

答案 2 :(得分:0)

如果你这样做

for(int i=0; i<something.size(); ++i);

这是正确的。 您应该查看一些C ++手册中的循环外观。 你的第二个例子是无效的C ++代码

答案 3 :(得分:0)

这两个例子不一样。

for(int i=0, n=something.size(); i<n; ++i)
{
    // ....
}

只评估something.size()一次。

for(int i=0; i<something.size(); ++i)  // Syntax corrected 
{
    // ....
}

在每个循环中计算something.size()。

因此,如果在执行循环时something.size()发生了变化,它们的行为可能会有很大差异。

如果你知道something.size()不会改变,你应该为性能原因寻找第一个解决方案(即只有一次调用something.size())。

如果something.size()可以改变(例如在for循环的主体中),那么第二种选择就是可行的方法。