gpt4 book ai didi

c++ - 持久化 std::chrono time_point 实例

转载 作者:IT老高 更新时间:2023-10-28 22:35:17 28 4
gpt4 key购买 nike

持久化 std::chrono time_point 实例,然后将它们读回另一个相同类型的实例的正确方法是什么?

   typedef std::chrono::time_point<std::chrono::high_resolution_clock> time_point_t;

time_point_t tp = std::chrono::high_resolution_clock::now();
serializer.write(tp);
.
.
.
time_point_t another_tp;
serializer.read(another_tp);

对写入/读取的调用,假设类型 time_point_t 的实例可以以某种方式转换为字节表示,然后可以写入或读取磁盘或套接字等。

Alf 建议的可能解决方案如下:

   std::chrono::high_resolution_clock::time_point t0 = std::chrono::high_resolution_clock::now();

//Generate POD to write to disk
unsigned long long ns0 = t0.time_since_epoch().count();

//Read POD from disk and attempt to instantiate time_point
std::chrono::high_resolution_clock::duration d(ns0)

std::chrono::high_resolution_clock::time_point t1(d);

unsigned long long ns1 = t1.time_since_epoch().count();

if ((t0 != t1) || (ns0 != ns1))
{
std::cout << "Error time points don't match!\n";
}

<罢工>注意:上面的代码有一个bug,因为最终实例化的时间点与原来的不匹配。

在旧样式 time_t 的情况下,通常只是根据其 sizeof 将整个实体写入磁盘,然后以相同的方式将其读回 - 简而言之,与新的 std::chrono 类型等效的是什么?

最佳答案

从磁盘或套接字读取意味着您可能正在读取未执行写入的应用程序实例。而在这种情况下,仅序列化持续时间是不够的。

time_point 是自未指定时期以来的 duration 时间量。时代可以是任何东西。在我的计算机上, std::chrono::high_resolution_clock 的时代是计算机启动时。 IE。此时钟报告自启动以来的纳秒数。

如果一个应用程序写入 time_since_epoch().count(),计算机重新启动,然后另一个(或什至相同的)应用程序将其读回,则读入的值没有任何意义,除非你碰巧知道两次启动之间的时间量。

要可靠地序列化 time_point,必须安排写入者和读取者就某个 epoch 达成一致,然后确保写入和读取的 time_point 是相互尊重的到那个时代。例如,可以安排使用 POSIX 纪元:New Years 1970 UTC。

事实证明,我知道的每个 std::chrono::system_clock 实现都使用 Unix time ,从 1970 年新年开始测量的 UTC 的近似值。但是我知道 std::chrono::high_resolution_clock 没有共同的时代。

只有当您能够以某种方式确保读取器和写入器时钟在一个共同的纪元上达成一致时,您才能将 time_point 序列化为持续时间。

关于c++ - 持久化 std::chrono time_point 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22291506/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com