所以,如果我们有以下代码:
vector<string> vec1;
//initialize vec1 to contain thousands of strings
for (int i = 0; i < vec1.size(); i++) {
//.....
}
for (int j = 0; j < vec1.size(); j++){
//......
}
声明一个int vec_size = vec1.size()并使用它会更快:
int vec_size = vec1.size();
for (int i = 0; i < vec_size; i++) {
//.....
}
for (int j = 0; j < vec_size; i++) {
//.....
}
如果有,为什么?
答案 0 :(得分:4)
取决于编译器优化设置。在某些优化设置中,编译器可能会意识到字符串没有改变,因此只调用一次函数。
在for
循环中,每次迭代都会调用表达式j < vec1.size()
。如果向量大小在循环中没有改变,那就是一堆浪费的函数调用。调用一次并分配给变量会将执行减少到std::vector::size()
的一次调用。
顺便说一下,size()
方法返回size_t
,它通常与unsigned int
兼容。 (向量不能有负数)。
所以你的循环应该是:
const size_t vec_size = vec1.size();
for (unsigned int i = 0; i < vec_size; ++i)
{
//...
}
将向量大小变量声明为常量允许编译器执行更多优化;你告诉编译器变量不会改变它的值。
答案 1 :(得分:2)
有时。如果编译器优化已关闭(例如,对于调试版本),则方法调用甚至可能不会内联,并且可能会有所不同。
C ++编译器非常擅长优化 - 通常编译器会首先内联方法调用,并且根据循环的内容,它会看到向量内部没有变化并为其分配寄存器值,而不是每次从对象读取它(同样,取决于循环体 - 在复杂的循环中,将寄存器专用于此没有意义,因为它为所有其他工作留下了少一个寄存器,所以不会这样做。)这归结为完全一样,就像你自己吊起来一样。
在实践中 - 不要手动提升。它会损害代码的可读性,并且除非优化已关闭,否则不会提高速度,在这种情况下,无论如何都会有更大的低效率。