#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
erh。私は誰もがそれを知っていると思った...(私はしない限り)。 –