在多次使用时将矢量大小存储到int变量中是否更有效?

时间:2016-01-28 03:55:56

标签: c++

所以,如果我们有以下代码:

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++) {
        //.....
    }

如果有,为什么?

2 个答案:

答案 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 ++编译器非常擅长优化 - 通常编译器会首先内联方法调用,并且根据循环的内容,它会看到向量内部没有变化并为其分配寄存器值,而不是每次从对象读取它(同样,取决于循环体 - 在复杂的循环中,将寄存器专用于此没有意义,因为它为所有其他工作留下了少一个寄存器,所以不会这样做。)这归结为完全一样,就像你自己吊起来一样。

在实践中 - 不要手动提升。它会损害代码的可读性,并且除非优化已关闭,否则不会提高速度,在这种情况下,无论如何都会有更大的低效率。