boost::variant声称它是一种值类型。这是否意味着只要简单地写出 boost::variant 的原始表示并稍后将其加载回来是安全的,只要它只包含 POD 类型?假设它将被相同编译器和相同版本的 boost 在相同架构上编译的代码重新加载。
此外,(可能)等效地,可以在共享内存中使用 boost::variant 吗?
boost::variant声称它是一种值类型。这是否意味着只要简单地写出 boost::variant 的原始表示并稍后将其加载回来是安全的,只要它只包含 POD 类型?假设它将被相同编译器和相同版本的 boost 在相同架构上编译的代码重新加载。
此外,(可能)等效地,可以在共享内存中使用 boost::variant 吗?
尝试只包括 boost/serialization/variant.hpp;它为您完成工作。
关于序列化:它应该工作,是的。但是为什么不使用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 类型时才有效。
boost::variant 的内存布局如下: { int which; storage_t 存储;}。storage_t 由实现确定为您的使用所需的最大大小。因此,如果您的 storage_t 为 8 字节或更多(或需要 8 字节对齐),则“which”和“storage”之间可能涉及 4 字节填充,具体取决于编译器或编译器选项。因此,正如公认的答案所说,使用访问进行序列化更安全。