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