2016-08-10 9 views
2

2次元の点集合の凸包を求めるクラスがあります。それは内部に2 Eigen::Matrix<double, 2, 1>を持つ構造体を含んでいます。これは、(削除、多くの事で)次のようになります。このようなベクトルedgesにエッジを追加するとき固有のアラインメントされていない配列アサート

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 
}; 

私は、アサーションエラーを取得しています:

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

正確なエラーがある:

アサーションに失敗しました:(reinterpret_cast(配列)& 0xf)== 0 & & "このアサーションはここで説明されています:" "http://eigen.tuxfamily.org/dox-devel/group__TopicUnalign edArrayAssert.html" "****このウェブページを読む!!! ****」、 \何とか\何とか\何とか\を含むファイル\固有\固有固有dc6cfdf9bcec \固有\ SRC \コア\の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とし、固有のバージョン3.2.9で何が起こっている同じコード無修正作品を。 GCCバージョン5.3のLinuxでは、Eigenのベータ版がうまく動作します。この問題を引き起こすために、この新しいバージョンで何が間違っていますか?

答えて

3

整列される固定サイズの固有型を含むstd::vectorがあります。 問題はstd::vector<edge>です。edgeには固定サイズのアライメントEigen::Matrix<double, 2, 1>が含まれています。ここで は、EIGEN_MAKE_ALIGNED_OPERATOR_NEWは、固定サイズのベクトル化固有のタイプ、またはクラスにSTLコンテナを使用してhttps://eigen.tuxfamily.org/dox/group__TopicStlContainers.html

で説明したように、あなたは、さらに、このような種類の部材を有する>固有の整列アロケータを選択する必要があり、十分ではありません取って、次のものが必要2つのステップ: (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では、あなたはそれが働いただけでラッキーだった(多分32bit版/ 64bit版ので)、あなたのコードは本当に修正されなければなりません。

+0

この例では 'Eigen :: aligned_allocator 'と 'Eigen :: aligned_allocator > 'の違いは何ですか?私が尋ねる理由は、両方ともエラーのないコードを生成することです。 – Matt

+0

異なるタイプのアロケータを使用すると、実行時に何かが発生する可能性がありますが、注意が必要です。 – SpamBot

関連する問題