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

时间:2014-06-24 14:46:14

标签: c++ arrays std eigen

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

但是,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];

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

我还有其他选择吗?

3 个答案:

答案 0 :(得分:1)

您可以使用Eigen的aligned_allocator。有关详细信息,请参阅this page,但基本上您可以这样做:

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

另外,不要忘记为您的班级重载operator new。同样,所有细节都在Eigen的documentation中。

答案 1 :(得分:0)

您可以尝试使用memalign或posix_memalign来分配和对齐变量内存空间

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

答案 2 :(得分:0)

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

ClusterNode* array = new ClusterNode[n];

但是我想补充说明,在这种情况下,该类还需要返回指定的指针。它只会在一段时间内以一种非常烦人且无法解决的方式引起问题,但是经过大量的bug搜索后,我终于收到了一条有用的错误消息,指出我Eigen's documentation

文档摘要:Eigen需要16字节对齐的内存。以下案件将导致悲痛。

  1. 包含特征类型的标准容器
  2. 包含特征类型的类或结构
  3. 按值将特征类型传递给函数
  4. Windows上的
  5. gcc错误对齐(4字节)
  6. 如果我使用Alex提出的动态数组解决方案(ClusterNode根本就是变量),我还需要使用Eigen提供的宏来确保对象是对齐的。例如,

    class ClusterNode
    {
        Eigen::Matrix4d M;
    
    public:
        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    } 
    

    如果未包含宏,则数组声明有时会无提示失败。