2017-10-09 25 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インクルードを使用できます。 – 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

関連する問題