Ich habe einen Strom von Struktur-Zeitspannenwerten. Ich würde sie gern in eine native C ++ 11-Darstellung umwandeln, aber ich bin total von Chrono umgedreht. Was ist das beste Ziel und wie kommt man von einer Struktur Timespec oder Struct Timeval da dies eine einfache Transformation ist und Mikrosekunden gut genug für diese Timings ist? Ich nehme an, dass ich dazu kommen möchte, oder? std :: chrono :: system_uhr :: zeitpunkt
In diesem Fall ist timespec
die UNIX-Zeit von einem GPS. Und ja, sie verwenden eine 4-Byte-Sekunde (konvertierte Form, die im Speicher signiert und dann als vorzeichenlos geschrieben ist), die von 2038 genagelt wird.
Als Referenz werde ich dies dem C ++ - Reader für gsf
Manchmal sehe ich timespec
und timeval
als Dauer und manchmal sehe ich sie als Zeitpunkte. Sie müssen wissen, welche Art von Werten Sie halten. In <chrono>
sind diese beiden Konzepte verschiedene Typen.
Eine Dauer ist eine Zeitmenge: etwas, das Sie mit einer Stoppuhr messen würden. Beispieldauern sind 2 Minuten, 3 Sekunden, 4 Stunden und 16 Jahre.
Ein Zeitpunkt ist eine bestimmte Zeit: 14 Uhr, 14.07.2015, EDT, oder 6 Stunden, seit ich meinen Computer hochgefahren habe. Ein Zeitpunkt weist eine implizierte Epoche auf. Eine Epoche ist nur ein gemeinsam vereinbarter Ursprung, mit dem Sie die Zeit messen.
Wenn Ihr timespec
eine Dauer hat:
Wenn Ihr timespec
einen Zeitpunkt enthält, müssen Sie die Epoche kennen. Es ist wahrscheinlich, dass die Epoche 1970-01-01 00:00:00 UTC ist, wobei die Schaltsekunden vernachlässigt werden (dies ist Unix-Zeit ). Wenn ja, können Sie es in ein std::chrono::system_clock::time_point
setzen. Dieser Typ ist nicht garantiert diese Epoche, aber jede Implementierung tut:
wobei d
wie oben berechnet wird.
Wenn du timeval
hast, dann benutze microseconds
, wo ich nanoseconds
benutzt habe.
Sie können high_resolution_clock
oder steady_clock
time_points nicht portabel verwenden, da verschiedene Implementierungen unterschiedliche Epochen für diese Typen aufweisen.
Auch wenn Sie timeval
verwenden, wird in der Praxis duration_cast
überflüssig, da die Dauer d
implizit in alle Implementierungen von system_clock::duration
konvertiert wird:
Wenn Sie nicht sicher sind, ob Sie duration_cast
benötigen oder nicht, versuchen Sie es ohne. Wenn es kompiliert wird, brauchst du es nicht. Wenn Sie einen Fehler bei der Kompilierung bekommen, brauchen Sie ihn. Es wird benötigt, wenn die Dauer konvertiert wird und es keine genaue Konvertierung gibt.