如何加速我的面向对象的迭代器类?

时间:2010-11-18 17:07:06

标签: c++ stl iterator virtual inline

在问题Fast and flexible iterator for abstract class的帮助下,我为抽象类GridData创建了一个抽象的GridIterator。现在我可以使用GridIterator的任何具体子类来遍历GridData的任何具体子类。

然而,在测试过程中,我发现虚拟运算符++和虚拟运算符*运算符成为我算法的真正瓶颈。我想知道我能做些什么来加速它。由于抽象,内联可能对我不起作用?

我也想提供一个const Iterator。我不知道如何使用当前的类设计来完成这项工作。参考我原来的问题(Fast and flexible iterator for abstract class),我可以使用const T而不是T从STL前向迭代器创建一个ConstGridIterator作为子类吗?或者我是否必须实现每个迭代器类(GridIterator和baseImpl)的const版本?

1 个答案:

答案 0 :(得分:3)

执行STL并且不在迭代器或容器中使用虚方法。当被要求优化时,大多数编译器能够将大多数STL迭代器优化到它们被完全绕过的点,并且它们甚至不存在于目标文件中。例如,即使*(vector<T>.begin()+5)是具有构造函数,析构函数和复杂运算符重新定义的复杂类,vector<T>.__underlying_array[5]也可以优化为vector<T>::iterator

operator++begin()end()operator !=()的调用堆栈中的任何位置调用虚方法会阻止编译器正确优化此方法,因为该方法可以重新定义任何事情。虚拟方法不仅具有较小的运行时开销,而且通过使代码更加模块化,使代码无法实现。

如果你想要性能,可以考虑使用模板而不是继承,或调整你的编译器,说没有人继承这个类。这可能与您当前的设计相冲突,但您需要在这三者中选择两个优先级:性能,模块化和成本。