在Eigen中移动语义

vso*_*tco 6 c++ move eigen c++11

关于Eigen,我有几个问题:

  1. 有没有人知道是否有任何计划支持很快在Eigen移动语义?在Eigen3网页的TODO列表中找不到任何内容.现在我正在使用这个swap技巧摆脱临时工,比如说

    MatrixXd foo()
    {
        MatrixXd huge_matrix(N,N); // size N x N where N is quite large
        // do something here with huge_matrix
        return huge_matrix; 
    }
    
    MatrixXd A(N, N); 
    A.swap(foo());
    
    Run Code Online (Sandbox Code Playgroud)

    我非常想swap用C++ 11风格编写上面的代码

    A = foo();
    
    Run Code Online (Sandbox Code Playgroud)

    而不必担心临时返回foo().

  2. C++ 98/C++ 03编译器可以优化代码A = foo();来摆脱这种临时性吗?或者最安全的赌注是使用swap()

Col*_*mbo 5

复制elision将完成这项工作.即使是C++ 03编译器也会忽略它.
特别是,对于此代码,NRVO(命名返回值优化)将

MatrixXd foo()
{
    MatrixXd huge_matrix(N,N);
    return huge_matrix; 
}

MatrixXd A = foo();
Run Code Online (Sandbox Code Playgroud)

huge_matrix在内部构建A.C++ 03标准在[class.copy]/15中指定:

在以下情况下允许复制操作的这种省略(可以组合以消除多个副本):

  • return具有类返回类型的函数的语句中,当表达式是具有与函数返回类型相同的cv-unqualified类型的非易失性自动对象的名称时,可以通过直接构造自动对象来省略复制操作进入函数的返回值
  • 当一个未绑定到引用(12.2)的临时类对象被复制到具有相同cv-nonqualified类型的类对象时,可以通过将临时对象直接构造到省略副本的目标中来省略复制操作