1

对Eigen移动支持于 2011 年在此补丁中提交。但是我在 Matrix 头文件中找不到移动构造函数。此外,Eigen 网页仍然将移动语义列为“待办事项”项。这一切都表明补丁还没有提交到发布版本

这个测试程序证明了移动构造函数没有改变被移动的对象

#include <iostream>
#include <utility>

#include <eigen3/Eigen/Dense>

int main()
{
    Eigen::VectorXd first = Eigen::VectorXd::Constant(3, 3.14);
    std::cout << "first\n" << first << std::endl << std::endl;
    Eigen::VectorXd other = std::move(first);
    std::cout << "first\n" << first << std::endl << std::endl;
    std::cout << "other\n" << other << std::endl << std::endl;
    return 0;
}

输出是:

first
3.14
3.14
3.14

first
3.14
3.14
3.14

other
3.14
3.14
3.14

如何从Eigen 3.2.0 中的上述补丁中启用复制省略移动功能。?

编辑:

似乎 Eigen 类的移动语义没有任何问题。但是,只有默认的移动构造函数和移动赋值运算符。

提供显式移动构造函数和移动赋值运算符的补丁,可避免复制整个数据,但尚未合并到发布版本中。

我想知道:

  1. 如何将此补丁应用于 Eigen 3.2.0?是否有工具或者我应该手动修改文件。

  2. 有没有人有使用这个补丁的经验?

4

1 回答 1

5

我不确定您为什么认为该功能已“完成”:尽管已提交补丁,但该错误显然仍处于打开状态,根据您的经验,这表明该补丁尚未合并到 Eigen 源代码树中。

您的测试用例中还有一个错误:您似乎期望first在移动后以某种方式“空”,但它将处于未指定状态。尽管快速浏览该补丁提交确实可以看出人们可能会期望实践中的“空”结果,但补丁中没有足够的上下文来真正知道移动对象将处于什么状态。所以,除非你如果有其他信息来源,您的期望有些没有根据。

于 2014-02-01T20:44:33.680 回答