正确使用 Eigen::Ref<> 类
Posted
技术标签:
【中文标题】正确使用 Eigen::Ref<> 类【英文标题】:Correct usage of the Eigen::Ref<> class 【发布时间】:2014-02-03 15:12:32 【问题描述】:Eigen 引入了 Ref 类来编写以 Eigen 对象作为参数的函数,而无需使用不必要的临时变量,当不需要编写模板函数时。可以阅读此here。
当进一步搜索互联网时,我发现了几个使用 Ref 类的不同参数声明。在 Eigen 文档中,他们在第一个示例中使用 const Eigen::Ref<const Eigen::MatrixXf>&
作为只读参数。在第二个示例中,Eigen::Ref<Eigen::MatrixXd>
用于读写参数,但这里const Eigen::Ref<const Eigen::MatrixXd>
用于只读参数(无参考)。所以我的问题是:
以下声明有什么区别,什么时候使用?`
const Eigen::Ref<const Eigen::MatrixXd>&
const Eigen::Ref<const Eigen::MatrixXd>
const Eigen::Ref<Eigen::MatrixXd>&
const Eigen::Ref<Eigen::MatrixXd>
Eigen::Ref<const Eigen::MatrixXd>&
Eigen::Ref<const Eigen::MatrixXd>
Eigen::Ref<Eigen::MatrixXd>&
Eigen::Ref<Eigen::MatrixXd>
为了完整起见,我列出了 const 用法和引用的所有可能组合。
【问题讨论】:
就我个人而言,我会将const Eigen::Ref<const Eigen::MatrixXd>
用于只读参数,Eigen::Ref<Eigen::MatrixXd>
用于读写参数。但我不确定参考 (&
)。
【参考方案1】:
一般来说,使用像 Ref<T>&
这样的非 const 引用绝不是一个好主意,因为这只有在调用者手头已有 Ref<T>
对象时才有效。这会丢弃 5 和 7。
案例 3 和 4 没有意义,一般不会编译。
那么,const Ref<const T>
和 const Ref<const T>&
之间没有太大区别,因为不太可能使用现有的 Ref<const T>
对象调用该函数,因此大多数情况下都必须创建 Ref<const T>
无论如何。尽管如此,我们仍然可以推荐 1 而不是 2 或 6。
因此,总而言之,我们可以推荐 Ref<T>
用于可写引用,const Ref<const T>&
用于 const 引用。
如果您想通过使用placement new 调用Ref
构造函数来更改引用的矩阵(而不是其内容),则选项6 Ref<const T>
可能仍然很有趣。
【讨论】:
你能详细说明为什么你会推荐const Ref<const T>&
(有&
)而不是const Ref<const T>
(没有&
)吗?似乎没有 &
它会涉及 Ref 对象的副本(我认为这很便宜)。在非常量情况下,Ref 对象无论如何都会被复制,对吗?那么通过Ref&
与Ref
时的性能会有所不同吗?
这是因为如果T
是固定大小的静态分配类型,例如Matrix4d
,那么 RefMatrix4d
作为属性,以防传递的对象是不兼容。因此,与总是便宜的Ref<T>
不同,Ref<const T>
可能更重。以上是关于正确使用 Eigen::Ref<> 类的主要内容,如果未能解决你的问题,请参考以下文章