2010-11-18 52 views
0

在問題Fast and flexible iterator for abstract class的幫助下,我爲抽象類GridData創建了一個抽象GridIterator。現在我可以使用GridIterator的任何具體子類來遍歷GridData的任何具體子類。如何加快我的面向對象的Iterator類?

但是,在測試過程中,我發現虛擬運算符++和虛擬運算符*運算符成爲我算法的真正瓶頸。我想知道是否有任何事情可以加快速度。由於抽象,內聯可能不適合我?

我想提供一個const Iterator。我不知道如何使這個工作與當前的課程設計。參考我的原始問題(Fast and flexible iterator for abstract class),我可以創建一個ConstGridIterator作爲STL前向迭代器的子類,並使用const T代替T?或者我必須實現每個迭代器類(GridIterator和baseImpl)的const版本?

回答

3

做爲STL並且不要在迭代器或容器中使用虛擬方法。當被要求優化時,大多數編譯器能夠優化大多數STL迭代器,直到它們被完全繞過,並且它們甚至不存在於目標文件中。例如,即使vector<T>::iterator是一個帶有構造函數,析構函數和複雜運算符重定義的複雜類,*(vector<T>.begin()+5)也可以優化爲vector<T>.__underlying_array[5]

具有在operator++begin()end()operator !=()調用堆棧任何地方虛方法調用阻止編譯器正確優化,是因爲該方法可以用任何東西來重新定義。虛擬方法不僅具有很小的運行時間開銷,而且通過使代碼更加模塊化而使代碼不可優化。

如果您需要性能,請考慮使用模板而不是繼承,或者調整您的編譯器,並說沒有人繼承此類。這可能與您當前的設計衝突,但您需要從三個方面中選擇兩個:性能,模塊性和成本。