2009-07-28 2 views
6

boost::variant은 값 유형이라고 주장합니다. 이것은 단순히 boost :: variant의 원시 표현을 쓰고 POD 유형 만 포함하는 한 나중에 다시로드하는 것이 안전하다는 것을 의미합니까? 동일한 아키텍처에서 동일한 컴파일러와 동일한 버전의 부스트로 컴파일 된 코드로 다시로드한다고 가정합니다.raw boost :: variant를 직렬화하는 것이 안전합니까?

또한 (아마도) 동등하게 boost :: variant를 공유 메모리에 사용할 수 있습니까?

+1

POD의 구조 일지라도 원시 메모리 표현을 사용하지 않는 것은 좋지 않은 생각이며 컴파일러의 패딩 레이아웃, 아키텍처 세부 정보 및 엔디안을 자비로 생각할 수 있습니다. – Thanatos

+0

당시 나는 레이아웃의 차이점이 전혀 문제가되지 않을 공유 메모리 사용에 더 관심이있었습니다. – bdonlan

답변

6

직렬화 관련 : 예, 작동합니다. 그런데 변형에 포함 된 실제 유형을 쓰려면 boost::variant의 방문 메커니즘을 사용하지 않으시겠습니까? 공유 메모리에 관한

struct variant_serializer : boost::static_visitor<void> { 
    template <typename T> 
    typename boost::enable_if< boost::is_pod<T>, void>::type 
    operator()(const T & t) const { 
     // ... serialize here, e.g. 
     std::cout << t; 
    } 
}; 

int main() { 

    const boost::variant<int,char,float,double> v('1'); 

    variant_serializer s; 
    boost::apply_visitor(s, v); 

    return 0; 
} 

: 당신은 단지 int처럼 공유 메모리에 배치 할 수 있도록 boost::variant은 물론, 적절한 동기화를 가정, 힙 할당을 수행하지 않습니다.

당신이 말한 것처럼 말할 필요도없이, 변형은 POD 유형 만 포함 할 수있는 경우에만 유효합니다.

+0

나는 진짜 유형을 말하기 위하여 상투적 인 부호의 제비를 쓰는 것을 피하고 싶으면 – bdonlan

+0

다량 상용구 부호 필요로하지 않았다; 위를 본다 –

14

부스트/직렬화/변형 .hpp; 그것은 당신을 위해 일합니다.

+0

POD 유형이 아니더라도이 기능이 작동합니까? boost :: variant가 아닌 POD 타입을 위해 std :: string – SeniorLee

+0

seeing을 만들었다면 (그렇지 않으면 태그가 붙은 유니온을 사용할 수 있습니다.) 그렇다고 생각 하겠지만 빠른 테스트가 확인됩니다. – spiderlama

관련 문제