2017-10-09 3 views
0

사용자 정의 구조체를 직렬화 할 수 있다는 것이 유용하다는 것을 알게되었습니다. 나는 보통 다음과 같은 것을 사용합니다.C++에서 Msgpack으로 컴파일 시간을 줄이는 방법은 무엇입니까?

#include <msgpack.hpp> 
struct MyStruct { 
    int val; 
    MSGPACK_DEFINE_MAP(val); 
}; 

다음은 필요한 곳에 포함될 것입니다. 나는 나중에 긴 컴파일 시간을 알아 차렸다. g ++을 -H 플래그와 함께 실행했을 때, 포함 된 파일 중 1/3 정도가 msgpack과 관련이 있음을 발견했습니다.

헤더가 어디서나 재사용되고 컴파일 시간이 늘어나는 것을 피하면서 쉽게 msgpack을 사용할 수 있습니까?

+1

미리 컴파일 된 헤더는 대개 큰 헤더에 대한 대답입니다. 적은 수의 번역 단위에서 msgpack만을 사용하고 ODR 위반으로 인해 정의되지 않은 동작에 대해별로 신경 쓰지 않으면 #ifdef 매크로와 msgpack include를 사용할 수 있습니다. – PeterT

+0

미리 컴파일 된 헤더에 소용돌이 줄 것입니다. 나는 .. msgpack을 필요로하는 모든 빌드 타겟은 USE_MSGPACK과 같은 플래그를 정의 할 것이고, 나는이 ifdef를 모든 곳에 가지고있을 것인가? – sardine

+0

msgpack을 클래스 정의 내에서 사용해야하는 경우 msgpack을 사용하지 마십시오. .cpp 파일에서 사용할 수있는 것을 찾으십시오. – o11c

답변

0

나는 매우 msgpack에 익숙하지 않지만 내 생각에 나온 첫 번째 아이디어는 pimpl 클래스입니다. 그런 다음, pimpl을 직렬화에 사용할 수 있는지, msgpack 문서를 살펴 보았는지 궁금합니다.

There is a non-intrusive msgpack 매퍼 정의 방법. 이 코드를 별도의 MyStruct_serialize.hpp 파일에 넣고 실제로 클래스를 직렬화하는 경우에만이 코드를 포함 할 수 있습니다. 이렇게하면 대부분의 코드가 msgpack 헤더를로드해서는 안됩니다.

+0

알다시피, 비 침입적 접근 방식은 내가 원하는 것을 할 것이다. 불행히도 많은 상용구를 작성해야합니다. – sardine