代码之家  ›  专栏  ›  技术社区  ›  bdonlan

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

  •  6
  • bdonlan  · 技术社区  · 17 年前

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

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

    2 回复  |  直到 17 年前
        1
  •  15
  •   spiderlama    15 年前

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

        2
  •  7
  •   Marc Mutz - mmutz    17 年前

    关于序列化:应该可以。但是你为什么不使用 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类型时,上述内容才有效。

        3
  •  0
  •   sanjivgupta    5 年前

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

    推荐文章