2016-08-10 3 views
2

2 차원 집합의 볼록 선체를 찾는 클래스가 있습니다. 그것은 안에 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 (배열) & 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에 무슨 일이 일어나고 동일한 코드 수정되지 않은 작품. 버전 3.2.0에서 괜찮아 .GCC 버전 5.3 리눅스에서 아이겐의 베타 빌드와 함께 잘 작동합니다.이 새로운 버전으로이 문제를 일으키는 내가 뭘 잘못하고 있습니까?

답변

3

조정할 고정 크기 Eigen 유형이 들어있는 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

에 설명 된대로 추가로 같은 종류의 회원을 가진> 아이겐의 정렬 할당자를 선택할 필요가 충분하지 않습니다 복용하려면 다음이 필요합니다 두 단계 : (i) 16 바이트 정렬 된 할당자가 사용되어야합니다. Eigen은 사용할 준비가 된 것을 제공합니다 : aligned_allocator. (ii) std :: vector 컨테이너를 사용하려면 #include <Eigen/StdVector>이 필요합니다.

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

가 경고 : 당신이 (아마도 때문에 32 비트/64 비트)를 일 단지 운이 리눅스에서 코드가 정말 수정해야

당신은이 (테스트하지) 대략 같은 코드를 수정해야 .

+0

이 예제에서'Eigen :: aligned_allocator '와'Eigen :: aligned_allocator > '의 차이점은 무엇입니까? 내가 물어 보는 이유는 모두 오류없이 코드를 생성하기 때문입니다. – Matt

+0

다른 유형을 위해 만들어진 할당자를 사용하면 * 런타임에 * 발생할 수있는 것처럼 들리므로주의해야합니다. – SpamBot

관련 문제