我们应该序列化 std::chrono::d uration 类还是 P.O.D.(普通旧数据)并且不需要序列化

Should we serialize std::chrono::duration class or is it P.O.D. (Plain Old Data) and no serialization is needed?

本文关键字:序列化 不需要 数据 chrono std uration 我们      更新时间:2023-10-16

我和我的朋友在C++中争论P.O.D类型。整个大惊小怪是关于我们是否应该序列化下面的结构。如果结构不是 P.O.D.(计划旧数据),我们应该序列化。

他说,如果官方标准没有说明,那么std::chrono::d uration必须是P.O.D.而不是由实现决定的,当我们总是序列化它时,我们会更安全。

但是,我写了一个小代码要点,证明它是微不足道的,具有标准布局,因此是 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;
}

你的代码只"证明"一件事:你运行它的实现实现了duration这样它是微不足道的可复制和标准布局。标准中没有任何内容要求这样做,因此任何其他实现(包括同一库的更高版本)都可以自由更改规则。

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