#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 hereIterator會多次循環調用end()嗎?
假設我用的優化(如g++ -Ofast
)。
在A行中,程序會多次調用range.end()
,而不是保存range.end()的值,並在循環的每次迭代中將其與該值進行比較?
在B行中,程序會多次調用range.begin()
,而不是保存整個循環的range.begin()
的值,然後在循環的每次迭代中從該值中減去該值?
爲什麼不編譯和檢查程序集? – NathanOliver
呃。我想每個人都會知道......(除非我不知道)。 –