【问题标题】:How to speed up my object oriented Iterator class?如何加速我的面向对象的迭代器类?
【发布时间】:2010-11-18 17:07:06
【问题描述】:

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

但是,在测试过程中,我发现 virtual operator++ 和 virtual operator* 运算符成为我算法的真正瓶颈。我想知道是否有什么我可以做的来加快它。由于抽象,内联可能对我不起作用?

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

【问题讨论】:

    标签: c++ stl iterator virtual inline


    【解决方案1】:

    像 STL 一样做,不要在迭代器或容器中使用虚方法。大多数编译器在被要求优化时,能够优化大多数 STL 迭代器,使其完全被绕过,甚至在目标文件中都不存在。例如,*(vector&lt;T&gt;.begin()+5) 可以优化为 vector&lt;T&gt;.<em>_</em>_underlying_array[5],即使 vector&lt;T&gt;::iterator 是具有构造函数、析构函数和复杂运算符重定义的复杂类。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      相关资源
      最近更新 更多