std::vector<int> someVector;
for (unsigned int i = 0; i < someVector.size(); i++)
{
// do something
}
someVector.size()
的值是否每次计算?
答案 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()
的来电。
正如其他人已经指出的那样,结果可能取决于
不计算任何东西,整个循环就会被优化掉。
答案 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是否属于那个。