我有一个大std::vector<Eigen::Array<float, Eigen::Dynamic, 1>>
坐在内存中的某个地方。我可以将此 vector 的迭代器传递给函数,如下所示:
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()
给出了外部 vector 中位置的正确内存地址)。然而,由于传递纯粹的微妙之处Eigen
类型,看起来几乎“太容易了”。我的问题是:我是否可以确信上述方法不会导致创建临时对象?或者当我取消引用( *v1_beg
)时可能会调用临时变量?
感谢您的评论!
最佳答案
在您的示例中 *v1_beg
将返回对 Eigen::Array<float, Eigen::Dynamic, 1>
的引用(顺便说一句,与 Eigen::ArrayXf
相同),直到该位置都没有调用特征代码。然后实际的特征代码调用(半伪代码):
ArrayXf::operator+=(operator*(const ArrayXf&, const ArrayXf&))
这确实可以在没有临时变量的情况下工作。
关于c++ - 传递指向特征类型 vector 的 std::iterator,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40218354/