2013-10-23 2 views
2

이 간단한 클래스의 클래스 멤버는 메모리의 연속인가? 다른 게시물에서고유 행렬이있는 클래스의 연속 데이터?

class A{ 
    A(){ /* somecode */} 
    ~A(); 
    Eigen::Matrix<5,1,double> a; 
    Eigen::Matrix<9,1,double> b; 
}; 

std::vector<A> vec(10); 

char * p = interprete_cast<char*>(&vec[0]); 

// the pointer p can now continously access all "a" and "b" in continous order -> (a,b,...,a,b) 

// For example write all data to a binary file! 
file.write(p, sizeof(A)*vec.size()) 

이 무엇인가에 대한 #pragma pack 등을 언급? 여기가 필요합니까? Link

또는 더 나은이 물건을 직렬화 나쁜, 나쁜 방법입니다

+1

당신은 간단한 테스트를 수행 할 수 있습니다'에게는 sizeof (A)'와'는 sizeof (A : A) + sizeof 연산자를 비교 (A : B)'. 값이 같지 않으면 어딘가에 패딩이 있습니다. – Michael

답변

1

:-) alot을 struct

덕분에 회원을 포장하는 것입니다. 대부분의 아마, Eigen::Matrix 객체는 당신이 그들을 역 직렬화 할 때 불쾌하게 놀랄 것입니다 의미 힙 할당 (즉, 그들이 가지고있는 포인터)를 포함한다.

그 이외에, 당신은 (그것을, 일부 최적화 옵션을 설정하여 변경 다른 아키텍처로 이식하여 말할 것도 매우 쉽다)이 정렬이 두 프로그램 사이에 변경되지 않았습니다 보장해야합니다.

(라이브러리)에 따라 즉시 사용을 찾을 일 수 중 하나 (더 나은 아직) 휴대용 방식으로 일을 기록하거나 자신의 직렬화 코드를 작성합니다 직렬화하기위한 적절한 방법.

질문에 답해 드리겠습니다. 아니요, 이 아니며이 아니며 A의 인스턴스가 인접하도록 보장됩니다. 사실, 그들은 가장 아마도 "자연"워드 크기로 정렬 (sizeof(A)은 그 단어의 크기로 나눌 경우, 그들은 연속 될 것이다).