2014-06-24 1 views
0

클래스 변수로 Eigen::Matrix4d을 포함하는 클래스 ClusterNode이 있습니다. 나는 또한 numNodes()이라는 함수를 가지고있어서 ClusterNode의 총 수를 알려주고 배열,리스트 또는 벡터로 그들을 수집 할 수있다.정렬 된 데이터 유형 Eigen :: Matrix에 대한 배열 또는 벡터 선언

그러나 Eigen::Matrix4d 내가 시도 배열을 사용하여 I는이 질문에 대한 대안으로서 error C2719: '_Val': formal parameter with __declspec(align('16')) won't be aligned?

에 응답 당으로서 std::vector<ClusterNode>이 타입의 객체를 저장할 수 없음을 의미하는 정렬된다. 함수의 반환 값이 상수로 간주되지 않기 때문에

그러나, 나는

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

할 수 없습니다.

다른 옵션에는 어떤 것이 있습니까?

+1

'ClusterNode * array = new ClusterNode [n]; ' –

+0

그 링크 된 질문에서 답을 읽었습니까?'std :: vector'는 더 이상 요소 타입을 값으로 전달하지 않으므로 더 이상 함수 매개 변수의 오버런이 문제되지 않습니다. –

+0

@Ben 컴파일러 오류가 계속 발생하기 때문에 오래된 컴파일러 버전이 있어야합니다. – Cecilia

답변

1

을 memalign을 사용하거나 할당 할 posix_memalign 및 정렬 시도 할 수 있습니다. 세부 사항에 대한 this page을 볼 수 있지만, 기본적으로는 수행 할 수 있습니다

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

는 또한 클래스에 대한 새로운 연산자를 오버로드하는 것을 잊지 마세요. 다시 말하면, 모든 세부 사항은 Eigen의 documentation에 있습니다.

0

나는 알렉스 페이버의 솔루션

ClusterNode* array = new ClusterNode[n]; 

를 사용하여 종료하지만이 경우, 클래스는 alligned 포인터을 반환해야한다는 메모를 추가하고 싶었다. 그것은 매우 성가신하고 untracable 방법으로 시간의 문제를 부분을 일으킬 것이다,하지만 많은 버그 사냥 후, 나는 Eigen's documentation을 지적 유용한 오류 메시지를 마침내 얻었습니다.

설명서 요약 : Eigen은 16 바이트의 정렬 된 메모리가 필요합니다. 다음과 같은 경우 슬픔으로 이어질 것입니다. 아이겐 유형을 값 함수 고유치 유형을 전달 고유치 유형

  • 함유
  • 클래스 또는 구조를 포함

    1. STD 용기
    2. 윈도우에
    3. GCC는 보유 잘못 정렬 (4 바이트)

    Alex가 제안한 동적 배열 솔루션 (ClusterNode를 변수로 사용하는 경우)을 사용하는 경우 객체가 정렬되도록 Eigen에서 제공하는 매크로도 사용해야합니다. 예 :

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

    매크로가 포함되어 있지 않으면 배열 선언이 자동으로 실패합니다.