6

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

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

4

3 回答 3

15

尝试只包括 boost/serialization/variant.hpp;它为您完成工作。

于 2010-08-06T01:36:13.830 回答
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 类型时才有效。

于 2009-07-28T19:20:07.090 回答
0

boost::variant 的内存布局如下: { int which; storage_t 存储;}。storage_t 由实现确定为您的使用所需的最大大小。因此,如果您的 storage_t 为 8 字节或更多(或需要 8 字节对齐),则“which”和“storage”之间可能涉及 4 字节填充,具体取决于编译器或编译器选项。因此,正如公认的答案所说,使用访问进行序列化更安全。

于 2020-10-01T16:51:32.833 回答