gpt4 book ai didi

c++ - C++ 循环中 vector::size() 的性能问题

转载 作者:IT老高 更新时间:2023-10-28 12:37:11 26 4
gpt4 key购买 nike

在以下代码中:

std::vector<int> var;
for (int i = 0; i < var.size(); i++);

size() 成员函数是每次循环迭代调用,还是只调用一次?

最佳答案

理论上,每次都会调用,因为一个for循环:

for(initialization; condition; increment)
body;

扩展为类似

{
initialization;
while(condition)
{
body;
increment;
}
}

(注意花括号,因为初始化已经在内部范围内)

在实践中,如果编译器了解您的条件在循环的所有持续时间内是不变的并且它没有副作用,它可以聪明地把它搬出去。这通常使用 strlen 完成。以及类似的事情(编译器很清楚)在没有写入其参数的循环中。

但是必须注意,最后一个条件并不总是容易证明的;一般来说,如果容器是函数的本地容器并且从不传递给外部函数,这很容易;如果容器不是本地的(例如它是通过引用传递的——即使它是 const )并且循环体包含对其他函数的调用,编译器通常必须假设这些函数可能会改变它,从而阻止提升长度计算。

如果你知道你的条件的一部分是“昂贵的”评估是值得的(而且这种条件通常不是,因为它通常归结为指针减法,这几乎肯定是内联的) .


编辑: 正如其他人所说,通常对于容器,最好使用迭代器,但对于 vector s 它不是那么重要,因为通过 operator[] 随机访问元素保证为 O(1);实际上,对于 vector ,它通常是指针总和( vector 基数+索引)和解引用与指针 increment(前面的元素+1)和迭代器的解引用。由于目标地址仍然相同,我认为您不能从迭代器中获得缓存位置方面的东西(即使是这样,如果您不是在紧密循环中遍历大数组,您甚至不应该注意到这样某种改进)。

对于列表和其他容器,使用迭代器代替随机访问可能真的很重要,因为使用随机访问可能意味着每次遍历列表时都会遍历,而递增迭代器只是指针取消引用.

关于c++ - C++ 循环中 vector::size() 的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3901630/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com