对齐数据类型 Eigen::Matrix 的数组或向量声明

Posted

技术标签:

【中文标题】对齐数据类型 Eigen::Matrix 的数组或向量声明【英文标题】:Array or vector declaration for aligned datatype Eigen::Matrix 【发布时间】:2014-06-24 14:46:14 【问题描述】:

我有一个类ClusterNode,其中包含一个Eigen::Matrix4d 作为类变量。我还有一个函数numNodes(),它告诉我ClusterNodes 的总数,以便我可以将它们收集到某种数组、列表或向量中。

但是,Eigen::Matrix4d 是对齐的,这意味着我不能将这种类型的对象存储在 std::vector<ClusterNode> 中,根据这个问题的答案 error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned?

作为替代方案,我尝试使用数组。

但是,我做不到

const int n = numNodes();
ClusterNode array [n];

因为函数的返回值不被视为常量。

我还有什么其他选择?

【问题讨论】:

ClusterNode* array = new ClusterNode[n]; 您是否阅读了该链接问题中的答案? std::vector 不再按值传递元素类型,因此函数参数的非过度对齐不再是问题。 @Ben 我必须有一个旧的编译器版本,因为我仍然得到编译器错误。 你的编译器版本是多少? @Ben Visual C++ 10,在 Visual C++ 11 中添加了修复 【参考方案1】:

您可以使用 Eigen 的对齐分配器。详情见this page,但基本上你可以做到:

std::vector<ClusterNode, Eigen::aligned_allocator<ClusterNode> >

也不要忘记为你的类重载 operator new。同样,所有细节都在 Eigen 的 documentation 中。

【讨论】:

【参考方案2】:

你可以尝试使用 memalign 或 posix_memalign 来分配和对齐一个可变的内存空间

http://man.he.net/man3/memalign

【讨论】:

【参考方案3】:

我最终使用了 Alex Faber 的解决方案

ClusterNode* array = new ClusterNode[n];

但我想补充一点,在这种情况下,类还需要返回对齐的指针。它只会在部分时间以一种非常烦人且无法追踪的方式引起问题,但经过多次寻找错误后,我终于收到了一条有用的错误消息,将我指向Eigen's documentation。

文档摘要:Eigen 需要 16 字节对齐的内存。以下情况会导致悲伤。

    包含特征类型的标准容器 包含特征类型的类或结构 按值将特征类型传递给函数 Windows 上的 gcc 对齐错误(4 字节)

如果我使用 Alex 提出的动态数组解决方案(ClusterNode 作为变量),我还需要使用 Eigen 提供的宏来确保对象对齐。例如,

class ClusterNode

    Eigen::Matrix4d M;

public:
    EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 

如果不包含宏,数组声明有时会静默失败。

【讨论】:

以上是关于对齐数据类型 Eigen::Matrix 的数组或向量声明的主要内容,如果未能解决你的问题,请参考以下文章

从函数返回两个浮点数组和 Eigen::Matrix3f

Eigen库笔记整理

将动态矩阵转换为 Eigen 中的固定矩阵

将行优先数组映射到列优先特征矩阵

从具有行主顺序的数组创建特征矩阵

g2oEigenMat矩阵类型转换