c++ - Iterator循环会多次调用end()吗?

标签 c++ loops iterator

#include <vector>
#include <iostream>

class Range {
    typedef typename std::vector<int> Vec;
    typedef typename Vec::iterator Iterator;
public:
    Range(Vec& vec, const int start_id, const int size)
            : vec_{vec},
              it_begin_{vec_.begin() + start_id},
              it_end_  {vec_.begin() + start_id + size}
    {}
    Iterator& begin() {return it_begin_;}
    Iterator& end()   {return it_end_;}
private:
    Vec& vec_;
    Iterator it_begin_;
    Iterator it_end_;
};

int main()
{
    std::vector<int> a;
    a.resize(100);
    Range range(a,0,10);
    for (auto it = range.begin(); it != range.end(); ++it) { // Line A
        std::cout << it - range.begin() << "\n"; // Line B
    }
}

Assembly here

假设我使用优化(如 g++ -Ofast)。

在 A 行中,程序是否会多次调用 range.end(),而不是保存 range.end() 的值并在循环的每次迭代中将该值与它进行比较?

在 B 行中,程序是否会多次调用 range.begin(),而不是为整个循环保存 range.begin() 的值,并且然后在循环的每次迭代中从中减去该值?

最佳答案

在您的代码中,优化器可以看到 begin()end() 的实现。它可以内联它们,并将不变量提升到循环之外。

如果 begin()end()main() 在不同的翻译单元中,答案可能会有所不同,因为链接时间对于此类优化来说通常为时已晚。

关于c++ - Iterator循环会多次调用end()吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40533339/

相关文章:

c++ - 打乱链表

c++ - 按字母顺序排列的字符串

perl - 有人可以解释这里的实际错误是什么以及如何解决吗?

c# - LINQ:如何跳过一个然后获取序列的其余部分

C++ 迭代器 : no appropriate default constructor available

c++ - 用 vector::iterator 或 at() 迭代 STL vector 有什么更快的方法?

c++ - 如何在没有别名问题的情况下实现 "_mm_storeu_epi64"?

c++ - 创建远程线程,错误5

c++ - 我如何重载 "new"运算符以从辅助存储设备分配内存?

java - 迭代器应该返回 HashSet 但充当对象