序列化原始boost :: variant是否安全?

时间:2009-07-28 15:16:51

标签: c++ serialization boost shared-memory boost-variant

boost::variant声称它是一种值类型。这是否意味着简单地写出boost :: variant的原始表示并稍后加载它是安全的,只要它只包含POD类型?假设它将由同一编译器编译的代码和相同版本的boost在同一架构上重新加载。

另外,(可能)等效地,可以在共享内存中使用boost :: variant吗?

3 个答案:

答案 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字节的填充,具体取决于编译器或编译器选项。因此,正如公认的答案所说,使用访问进行序列化比较安全。