传递std :: iterator指向特征类型

时间:2016-10-24 12:24:22

标签: c++ eigen

我有一个很大的std::vector<Eigen::Array<float, Eigen::Dynamic, 1>>坐在记忆中的某个地方。我可以将迭代器传递给这个向量到一个函数,如下所示:

typedef std::vector<Eigen::Array<float, Eigen::Dyanamic, 1>>::iterator ArrayIterator;

void MyFunction(ArrayIterator v1_beg, ArrayIterator v1_end,
                ArrayIterator v2_beg, ArrayIterator v2_end) {

   Eigen::Array<float, Eigen::Dynamic, 1> tmp(*v1_beg.size());
   tmp.setZero(); 
   while (v1_beg != v1_end) { tmp += *v1_beg++ * *v2_beg++; }

}

我知道如果想要避免临时性,将Eigen类型传递给函数可能是一项棘手的事情。上述解决方案似乎避免了临时性(例如,打印&(*v_beg).data()给出了外部向量中位置的正确存储器地址)。然而,由于传递纯Eigen类型所涉及的微妙之处,它几乎看起来“太容易”了。我的问题是:我能否相信上述方法不会导致临时工作的产生?或者,当我取消引用(*v1_beg)时,可能会调用临时值吗?

感谢您的任何评论!

1 个答案:

答案 0 :(得分:2)

在您的示例中,*v1_beg将返回对Eigen::Array<float, Eigen::Dynamic, 1>的引用(与Eigen::ArrayXf,btw相同),不会调用该特定代码。然后,实际的本征代码调用(半伪代码):

ArrayXf::operator+=(operator*(const ArrayXf&, const ArrayXf&))

确实没有临时工作。