我有一个很大的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
)时,可能会调用临时值吗?
感谢您的任何评论!
答案 0 :(得分:2)
在您的示例中,*v1_beg
将返回对Eigen::Array<float, Eigen::Dynamic, 1>
的引用(与Eigen::ArrayXf
,btw相同),不会调用该特定代码。然后,实际的本征代码调用(半伪代码):
ArrayXf::operator+=(operator*(const ArrayXf&, const ArrayXf&))
确实没有临时工作。