奇怪的无限循环(gcc 4.7.3,编译器错误?)

时间:2014-06-04 17:44:55

标签: c++ loops gcc infinite-loop branch-prediction

我有以下代码:

我愚蠢地迭代一个容器(自编)。 如果我使用cout编译此函数它可以工作,并且程序在迭代后正确终止! 注意: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:Compiled Example

感谢您的帮助!!

0 个答案:

没有答案