【发布时间】:2016-11-10 17:09:23
【问题描述】:
#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
}
}
假设我使用优化(如g++ -Ofast)。
在 A 行,程序是否会多次调用range.end(),而不是保存 range.end() 的值并在循环的每次迭代中与该值进行比较?
在 B 行,程序是否会多次调用range.begin(),而不是为整个循环保存range.begin() 的值,然后在循环的每次迭代中从中减去该值?
【问题讨论】:
-
为什么不编译并检查程序集?
-
呃。我以为每个人都会知道……(除了我不知道)。