我只是想知道为什么我会在c ++中这样做
for(int i=0, n=something.size(); i<n; ++i)
VS
for(int i=0; i<something.size(); ++i)
...
答案 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循环的主体中),那么第二种选择就是可行的方法。