我正在使用iterator_facade为类提供迭代器支持。但是,因为iterator_facade :: dereference通过引用返回,并且它是一个返回非平凡copy-const的对象,所以我的性能会因为不断执行这些而导致每次取消引用(如使用VTune进行分析)副本。有没有解决的办法?
class time_series::iterator : public boost::iterator_facade<
time_series::iterator,
time_series::variable_vec,
boost::bidirectional_traversal_tag,
timestep> //<--- dereference type
{
public:
iterator();
iterator(const iterator& src);
~iterator();
iterator& operator=(const iterator& rhs);
private:
//the following satisfies the reqs for a boost::facade bidirectional iterator
friend class boost::iterator_core_access;
friend class time_series;
const timestep& dereference() const;
bool equal(iterator const& other) const;
void increment();
void decrement();
std::ptrdiff_t distance_to(iterator const& other) const;
//iterators for the current step
timestep _currentStep;// <--returned on dereference, is non-trivial to copy.
};
编辑: 根据评论
const timestep& time_series::iterator::dereference() const
{
return _currentStep;
}
答案 0 :(得分:5)
您指定了timestep
而不是timestep&
作为Reference
模板参数,这就是它不断制作副本的原因。将其更改为timestep&
或完全删除。
由于某种原因,您可以按值将_currentStep
存储在迭代器中,因此每次递增或递减时都可能会复制。
阅读Boost tutorial on iterator_facade以获取有关如何正确实施外观的参考。