代码之家  ›  专栏  ›  技术社区  ›  Kamil Kuczaj

我们应该序列化std::chrono::duration类还是p.o.d.(普通的旧数据),而不需要序列化?

  •  0
  • Kamil Kuczaj  · 技术社区  · 6 年前

    我正在和我的朋友争论 P.O.D C++中的类型。整个问题是我们是否应该序列化下面的结构。如果结构不是 P.O.D. (规划旧数据)。

    他说,如果官方标准没有规定, 标准::时间::持续时间 必须是 P.O.D. 比它取决于实现,当我们总是序列化它时,我们更安全。

    但是我写了一些代码 gist 这证明它是微不足道的,具有标准的布局,因此 P.O.D.

    #include <iostream>
    #include <chrono>
    
    struct myStruct
    {
        std::chrono::seconds timeSec;
    };
    
    int main () {
        std::cout << std::boolalpha << "is_pod<std::chrono::seconds> = "
                  << std::is_pod<std::chrono::seconds>() << std::endl
                  << "is_pod<myStruct> = " << std::is_pod<myStruct>() << std::endl;
    
    
        std::cout << std::boolalpha << "is_trivial<std::chrono::seconds> = "
                  << std::is_trivial<std::chrono::seconds>() << std::endl
                  << "is_is_standard_layout<std::chrono::seconds> = "
                  << std::is_standard_layout<std::chrono::seconds>() << std::endl;
    
        std::cout << std::boolalpha << "is_trivial<myStruct> = "
                  << std::is_trivial<myStruct>() << std::endl
                  << "is_is_standard_layout<myStruct> = "
                  << std::is_standard_layout<myStruct>() << std::endl;
    }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Nicol Bolas    6 年前

    您的代码“证明”只有一件事:您运行它的实现实现 duration 这样,它是微不足道的可复制和标准布局。标准中没有规定 要求 它是这样的,所以任何其他实现(包括 相同的 库)可以自由更改规则。

    现在,你可以做一些 if constexpr / enable_if 或者类似的体操,这样如果一个实现提供了微不足道的可复制性,您就可以使用该能力而不是“序列化”它。但你不能 假定 情况总是这样的(除非你在一个你知道你将永远使用某个特定库的环境中工作);你只需在可用的地方利用它。