boost::variant聲稱它是一個值類型。這是否意味着只要寫出boost :: variant的原始表示並稍後加載它是安全的,只要它只包含POD類型?假設它將由相同編譯器編譯的代碼重新加載,並在相同的體系結構上重新加載相同版本的boost。序列化原始boost :: variant是否安全?
此外,(可能)等價地,boost :: variant可以用於共享內存嗎?
boost::variant聲稱它是一個值類型。這是否意味着只要寫出boost :: variant的原始表示並稍後加載它是安全的,只要它只包含POD類型?假設它將由相同編譯器編譯的代碼重新加載,並在相同的體系結構上重新加載相同版本的boost。序列化原始boost :: variant是否安全?
此外,(可能)等價地,boost :: variant可以用於共享內存嗎?
關於序列化:它應該工作,是的。但是,你爲什麼不使用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;
}
關於共享存儲器:boost::variant
不執行堆分配,這樣可以將其放置到共享存儲器中,就像一個int
,假設適當的同步,當然。
不用說,正如您所說,以上只有在變體只能包含POD類型時纔有效。
我想避免寫很多樣板代碼寫出所說的實際類型:) – bdonlan 2009-07-28 19:33:45
嘗試只包括boost/serialization/variant.hpp;它爲你做了工作。
吐出原始內存表示,即使它只是一個POD結構,是一個糟糕的主意,並且讓你受到編譯器的填充佈局,體系結構細節和字節順序的擺佈。 – Thanatos 2010-08-06 02:23:59
當時我更感興趣的是共享內存的使用情況,其中佈局差異根本不會成爲問題。 – bdonlan 2010-08-06 04:16:36