将Eigen对象作为参数传递时的指针与参考差异

时间:2013-06-10 18:21:57

标签: c++ pointers reference eigen

如果a有一个以特征矩阵作为参数的函数,那么它们之间会有什么区别:

void foo(Eigen::MatrixXd& container){
    for(i=0;i<container.rows();i++){
        for(j=0;j<container.cols();j++){
            container(i,j)=47;
        }
    }
}

void foo(Eigen::MatrixXd* container){
    for(i=0;i<container->rows();i++){
        for(j=0;j<container->cols();j++){
            container->coeffRef(i,j)=47;
        }
    }
}

Eigen documentation中,他们只提出第一种方法 - 这是否意味着该方法有任何优势?在第一种情况下传递Matrix引用时不使用const有什么缺点?

3 个答案:

答案 0 :(得分:5)

引用很好,因为没有null引用这样的东西,所以使用引用参数可以降低某人使用无效值调用函数的风险。

另一方面some coding standards建议创建您想要修改指针而不是非const引用的参数。这会强制调用者明确地获取它们传递的任何值的地址,从而使值更明显地被修改。指针与非const引用的选择取决于你。

但是,如果您不打算修改参数,那么将它作为const引用绝对是可行的方法。它避免了传递无效指针的问题,允许你传递临时值,并且调用者并不关心参数是否通过引用来处理,因为它不会被修改。

答案 1 :(得分:3)

使用C ++代码,可以期望如果参数作为指针而不是引用传递,则空指针是有效参数。

也就是说,默认情况下你应该使用参考参数。如果参数以某种方式“可选”,并且您希望调用者能够传递空指针以表示“无值”,则仅使用指针。

答案 2 :(得分:0)

见行:

container(i,j)=47.

这不是一个常量操作,所以你不能将它设置为const。

引用与指针不同的一种方式是容器引用不能为null。通过引用传递是避免一些错误,同时获得不复制的好处的好方法。