特征未对齐数组断言

时间:2016-08-10 20:59:02

标签: c++ eigen3

我有一个类可以找到一组2D点的凸包。它包含一个内部有2 Eigen::Matrix<double, 2, 1>的结构。它看起来像这样(删除了很​​多东西):

class Foo{
public:
    Foo(Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic>);

private:
    struct edge{
        unsigned int a;
        unsigned int b;
        Eigen::Matrix<double, 2, 1> slope;
        double mag;
        Eigen::Matrix<double, 2, 1> normal;
        std::vector<unsigned int> list;
    };

    Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> points;
    std::vector<edge> edges
};

向向量edges添加边时,我收到一个断言错误:

void Foo::DoThing(){
    edges.push_back(edge());
}

确切的错误是:

  

断言失败:(reinterpret_cast(array)&amp; 0xf)== 0&amp;&amp;   &#34;这个断言在这里解释:&#34;   &#34; http://eigen.tuxfamily.org/dox-devel/group__TopicUnalign   edArrayAssert.html&#34; &#34; ****阅读本网页!!! ****&#34;,文件   \ blah \ blah \ blah \ includes \ eigen \ eigen-eigen-dc6cfdf9bcec \ eigen \ src \ core \ densestorage.h,第86行

我去了网页,读到我需要添加这个宏: 我在结构中添加的EIGEN_MAKE_ALIGNED_OPERATOR_NEW如下:

struct edge{
        unsigned int a;
        unsigned int b;
        Eigen::Matrix<double, 2, 1> slope;
        double mag;
        Eigen::Matrix<double, 2, 1> normal;
        std::vector<unsigned int> list;

        EIGEN_MAKE_ALIGNED_OPERATOR_NEW
    };

但错误仍在继续。这与VS 2013和Eigen版本3.2.9一起发生。未经修改的相同代码适用于版本3.2.0。在使用GCC版本5.3的Linux上,它可以与Eigen的beta版本一起使用。这个新版本导致这个问题我做错了什么?

1 个答案:

答案 0 :(得分:3)

您有一个std::vector,其中包含要对齐的固定大小的特征类型。 问题是std::vector<edge>其中edge包含固定大小对齐的Eigen::Matrix<double, 2, 1>。 在这里,EIGEN_MAKE_ALIGNED_OPERATOR_NEW是不够的,您还需要选择Eigen的对齐分配器,如https://eigen.tuxfamily.org/dox/group__TopicStlContainers.html

中所述
  

在固定大小的可矢量化特征类型上使用STL容器,或者具有此类类型成员的类>,需要采取以下两个步骤:   (i)必须使用16字节对齐的分配器。 Eigen确实提供了一个可供使用的:aligned_allocator。   (ii)如果你想使用 std :: vector容器,你需要#include <Eigen/StdVector>

您应该大致更正您的代码(未经测试):

#include<Eigen/StdVector>
class Foo { 
  ...
  std::vector<edge,Eigen::aligned_allocator<edge> > edges;
}

警告:在Linux上你很幸运它有效(可能因为32位/ 64位),你的代码应该得到纠正。