C++ 序列化原始boost::variant安全吗?

C++ 序列化原始boost::variant安全吗?,c++,serialization,boost,shared-memory,boost-variant,C++,Serialization,Boost,Shared Memory,Boost Variant,声明它是值类型。这是否意味着只要boost::variant只包含POD类型,就可以安全地写出它的原始表示形式,并在以后重新加载?假设它将由同一编译器编译的代码在同一体系结构上重新加载,并使用同一版本的boost 同样,boost::variant可以在共享内存中使用吗?关于序列化:它应该可以工作,是的。但是为什么不使用boost::variant的访问机制来写出variant中包含的实际类型呢 struct variant_serializer : boost::static_visitor&

声明它是值类型。这是否意味着只要boost::variant只包含POD类型,就可以安全地写出它的原始表示形式,并在以后重新加载?假设它将由同一编译器编译的代码在同一体系结构上重新加载,并使用同一版本的boost


同样,boost::variant可以在共享内存中使用吗?

关于序列化:它应该可以工作,是的。但是为什么不使用boost::variant的访问机制来写出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/serialization/variant.hpp;boost::variant的内存布局如下:{int which;storage\u t storage;}。存储由实现确定为您的使用所需的最大大小。因此,如果您的存储是8字节或更多,或者需要8字节对齐,则“which”和“storage”之间可能会有4字节的填充,具体取决于编译器或编译器选项。因此,正如公认的答案所说,使用Visition进行序列化更安全。

我希望避免编写大量样板代码来写出所述的实际类型:吐出原始内存表示,即使它只是一个POD结构,也是一个糟糕的主意,而且会让您受制于编译器的填充布局、架构细节、,和endianness。当时我对共享内存的使用更感兴趣,在这种情况下,布局上的差异根本不会成为问题。boost::variant是为非POD类型设计的,否则您可以使用标记的联合,我认为是的,但快速测试会证实这一点。