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

问题描述 投票:0回答:2

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

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

如果是这样,为什么?

c++
2个回答
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)
{
  //...
}

将向量大小变量声明为常量可以让编译器执行更多的优化;您告诉编译器该变量不会更改其值。


2
投票

有时。如果编译器优化关闭(例如,对于调试构建),那么方法调用甚至可能不会被内联,并且可能会产生影响。

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

实际操作中——不要手动吊装。它会损害代码的可读性,并且不会提高速度,除非优化关闭,在这种情况下无论如何都会出现更大的低效率。

© www.soinside.com 2019 - 2024. All rights reserved.