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

Is it more efficient to store vector size into an int variable when using it multiple times?

本文关键字:int 存储 变量 有效 是否 向量      更新时间:2023-10-16

所以如果我们有下面的代码:

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

如果是这样,为什么?

取决于编译器优化设置。 在某些优化设置中,编译器可能会意识到字符串没有更改,因此只调用函数一次。

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

将向量大小变量声明为常量允许编译器执行更多优化;你告诉编译器变量不会改变其值。

有时。如果编译器优化处于关闭状态(例如,对于调试版本),则方法调用甚至可能没有内联,并且可能会有所作为。

不过,C++编译器非常擅长优化 - 通常编译器将首先内联方法调用,并且根据循环的内容,它将看到向量在其中没有变化并为值分配寄存器,而不是每次从对象读取它(同样,取决于循环体 - 在复杂的循环中, 将寄存器专用于此是没有意义的,因为它会为所有其他工作留下一个寄存器,因此不会完成)。这归结为与您自己吊起它完全相同的事情。

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