2013-06-30 2 views
0

의 복사본을 가져옵니다. 임의의 고유 벡터/배열 유형의 내용을 std :: array로 변환하려고합니다. 나는 고유치의 문서에서이 부분을 읽어 http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html 그래서 이것은 내 기능입니다 :고유 라이브러리 : 템플릿 함수 매개 변수

template<typename DERIVED> 
std::array<typename Eigen::DenseBase<DERIVED>::Scalar, Eigen::DenseBase<DERIVED>::RowsAtCompileTime> 
toStl (const Eigen::DenseBase<DERIVED>& input) 
{ 
... // Do conversion 
} 

문제는 내가 사본을하기 위해 입력 매개 변수 유형에서 앰퍼샌드를 제거 할 때, 내가를 얻을, 지금 빈 입력 변수. 그것은 계수 0에 대한 가짜 값을 포함하고 나머지는 0입니다.

참조로 매개 변수를 가져 가면 모든 것이 정상적으로 작동합니다. 아무도 왜 저에게 말할 수 있습니까?

추 신 : 내가 왜 사본을 가져 가고 싶은지 궁금한 사람들을 위해; 이 대화에서 최적화 도구를 돕기 위해 제안 되었습니까? http://www.youtube.com/watch?v=eR34r7HOU14 (두 번째 끝에서 끝까지)

+1

'Eigen :: DenseBase '에는 복사 생성자가 private 인 것처럼 보입니다. 따라서 앰퍼샌드없이 어떻게 컴파일했는지 명확하지 않습니다. –

+0

실제로'template 명시 적 DenseBase (const DenseBase <** OtherDerived **>)'는 비공개입니다. 그래서 _same_ type ('Eigen :: DenseBase ')에 대한 복사 생성자가 존재합니다 - 선언을 찾을 수는 없지만 - 기본 정의를 사용합니다. 수업이 비어 있기 때문에 아무 것도 복사되지 않아 내 문제를 설명합니다. –

답변

3

DenseBase <> 클래스는 빈 기본 클래스이므로 해당 유형의 개체를 만드는 것이 의미가 없습니다. 따라서 값으로 입력을 전달하려면 DenseBase가 아닌 DERIVED 유형이어야합니다. 그럼에도 불구하고, 그것은 당신의 기능이 다른 사본을 만들 수있는 유일한 목적인데도 가치에 의해 그것을 전달하는 것은 이상하게 들린다.

+2

나는이 답변에서도 요점을 강조하고 싶다. 'DenseBase <>'를 값으로 건네 주면 (자), 다형성을 회피하고 실제로는'DenseBase' 만 얻습니다. * 스 플라이 싱 *이라고합니다. 그래서 위에 서명 한 값으로 전달하는 것입니다. 또한 단 한 번이 아닌 두 번 데이터를 복사 했으므로 프로그램 *의 성능에 도움이되지 않습니다 *. 나는 비디오를 보지 못했지만, 여기에 적용될 것이라고 생각하지 않는 포인터 에일리어싱 *에 대해서 이야기 할 것입니다. – yzt

+0

이것은 내가 흥미 롭다. 그래서 나는 그것을 벤치마킹했다. 사본이 포함 된 버전은 참조가있는 버전보다 빠르게 재생되는 것처럼 보입니다. 30 개 이상의 요소가있는 벡터에 대해서도 (보통 나를위한 숫자는 trhee입니다.) 나는 gcc 4.7과 3.3을 테스트했고, 둘 다 똑같이 잘 수행되었다. –