2017-10-09 35 views
0

我發現能夠序列化用戶定義的結構很有用。我通常使用類似如何用C++中的Msgpack減少編譯時間?

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

這隨後會在任何地方需要它包括在內。後來我注意到編譯時間很長。當我用-H標誌運行g ++時,發現大約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