返回 Eigen::Ref 合法吗?
Is returning Eigen::Ref legit?
Eigen的文档解释了如何将Eigen::Ref
用作函数参数。将其用作函数返回值也是一个好主意吗?
例如
class XyTracker : public XyListener {
public:
XyTracker() = default;
XyTracker(XyTracker&&) = default;
XyTracker& operator=(XyTracker&&) = default;
const Eigen::Ref<const Eigen::ArrayXXd> Xs() const;
const Eigen::Ref<const Eigen::ArrayXd> Ys() const;
// XyListener
void OnXy(const Eigen::VectorXd& x, double y) final;
private:
Eigen::ArrayXXd xs_;
Eigen::ArrayXd ys_;
Eigen::Index n_ = 0;
};
inline const Eigen::Ref<const Eigen::ArrayXXd> XyTracker::Xs() const {
return xs_.topRows(n_);
}
inline const Eigen::Ref<const Eigen::ArrayXd> XyTracker::Ys() const {
return ys_.head(n_);
}
正如注释中已经指出的那样,返回Ref
对象没有错,只要您确保引用的对象在使用引用时仍然有效。
简化示例:
struct A {
ArrayXXd xs;
Ref<const ArrayXXd> Xs() const {
return xs.topRows(5); // works (when used properly)
}
Ref<const ArrayXXd> NotWorking() const {
ArrayXXd foo = 2*xs;
return foo.topRows(5); // compiles, but will give U.B.
};
// usage:
A a;
a.xs.setRandom(10,10);
Ref<const ArrayXXd> r1 = a.Xs();
// fine to use r1 here
a.xs.setRandom(20,20);
// from here on r1 will point to non-existing memory
// i.e., using r1 will be U.B.
U.B.(未定义的行为(示例本质上都是释放后使用,不幸的是,编译器几乎没有检测到,因此在使用Eigen::Ref
时需要小心。UB 可能意味着您的单元测试有效,尽管您的代码很糟糕,但是突然在生产中您会遇到段错误......
相关文章:
- 对RValue对象调用的LValue ref限定成员函数
- 将Ref对象作为类成员
- Eigen如何在容器循环中干净地附加矩阵
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 为什么我的 std::ref 无法按预期工作?
- 使用Pybind11向Python公开Eigen::张量
- 如何在没有数据拷贝的情况下从指针创建一个Eigen VectorXd对象
- Eigen:调用lpNorm()的正确方法
- 如何调整 std::vector of Eigen::MatrixXd 的大小
- 如何将 Eigen::Ref 与 pybind11 一起使用?
- Eigen c++ 三角形来自
- 如何@ref同一方法的不同变体?
- 使用带有 ref 参数的成员函数创建线程时出现编译错误
- 使用 operator() 扩展 Eigen::EigenBase
- 如何将 Eigen 库安装到 IAR c/c++ 编译器
- 返回 Eigen::Ref 合法吗?
- Create Eigen::Ref from std::vector
- 为什么"const Eigen::Matrix<>&"和"const Ref<Eigen::Matrix<> >"显然不兼容?
- Eigen::Ref<> 与 std::reference_wrapper<> 的优缺点是什么?
- Eigen::Ref<> 作为成员变量