std::vector<int> someVector;
for (unsigned int i = 0; i < someVector.size(); i++)
{
// do something
}
someVector.size()
的值是否每次都会被计算?
std::vector<int> someVector;
for (unsigned int i = 0; i < someVector.size(); i++)
{
// do something
}
someVector.size()
的值是否每次都会被计算?
#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()
。
正如其他人已经指出的,结果可能取决于
而且,在不计算任何内容的情况下,整个循环都被优化掉了。
const
引用。如果没有额外的 sum
函数,查看 OP 示例的汇编将会很有趣。 - juanchopanzastd::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(),它总是被优化的。我不确定vector.size是否属于这种情况。
vector::size
是const
的,所以如果满足上述条件,这可能是提示编译器仅调用一次的线索;2. 我无法想象出循环遍历向量并修改其大小的情况。我的意思是,确实有for (i = 0; i < 10; i++) v.push_back(i);
,但它不依赖于向量的大小,并且在枚举时修改它真的是一个坏主意(为了画出不太好的类比,在 Objective-C 中,NSMutableArray
明确禁止这样做并抛出异常——因为这真的是无意义的)。 - user529758