Странный бесконечный цикл (gcc 4.7.3, ошибка компилятора?)

У меня есть следующий код:

Где я тупо перебираю контейнер (сам написано).
Если я скомпилирую эту функцию с cout это работает, и программа завершается правильно после итерации! Примечание: носик не мешает самодельному контейнеру!
Если я тогда закомментировать, тест начинает длиться бесконечно долго и не заканчивается!
Мои глазные яблоки почти опустились в мою голову! Что за хак здесь происходит ???
Мое первое предположение было, что компилятор делает что-то не так? (но почему?) или что, может быть, предсказание ветвления неправильно играет меня и каким-то образом увеличивает итератор в два раза? (что приведет к отсутствию end () итератор).

Я действительно не могу объяснить, что происходит?

    int loops = 100;
int n = 0;

RangeTypes<Type>::ContainerType range(a);
INIT_TIMER
START_TIMER
for(int i=1; i<loops; i++) {
for(auto it=range.begin(); it != range.end(); ++it) {
n +=  *it;
//std::cout << i << std::endl;
}
}
STOP_TIMER("Range: ")

На самом деле контейнер RangeType выглядит следующим образом и довольно прост, он принимает диапазон и перебирает от начала до конца!

template<typename Type>
struct RangeTypes {
using  RangeType = std::pair<Type,Type> ;

class Iterator {
public:

Iterator(): m_rangePtr(nullptr), m_currVal(0) {};
~Iterator() {};
Iterator(RangeType & range, bool atEnd=false): m_rangePtr(&range) {
if(atEnd) {
m_currVal = m_rangePtr->second;
} else {
m_currVal = m_rangePtr->first;
}
};

/** pre-increment ++it
* Allow to iterate over the end of the sequence
*/
Iterator & operator++() {
if(m_rangePtr) {
++m_currVal;
}
return *this;
}

/** post-increment it++ */
Iterator operator++(int) {
Iterator it(*this);
operator++();
return it;
}

bool operator==(const Iterator &rhs) {
if(m_rangePtr) {
if(m_rangePtr == rhs.m_rangePtr ) { // if sequences are the same
return m_currVal == rhs.m_currVal;
}
}
return false;
}

// Return false if the same!
bool operator!=(const Iterator &rhs) {
return !(*this==rhs);
}

// get current value;
Type operator*() {
return m_currVal;
}

private:
RangeType * m_rangePtr;
Type m_currVal;
};

class ContainerType : public RangeType {
public:

typedef Iterator iterator;

ContainerType(RangeType & range ): RangeType(range) {
// if range wrong, set to no range!
if(this->first > this->second) {
this->first = 0;
this->second = 0;
}
}
iterator begin() {
return iterator(*this);
};
iterator end() {
return iterator(*this,true);
};
};
};

ЗДЕСЬ MWE: Скомпилированный пример

Спасибо за любую помощь!

4

Решение

Задача ещё не решена.

Другие решения


По вопросам рекламы [email protected]