namespace cpp

C++ lernen, kennen, anwenden

Benutzer-Werkzeuge

Webseiten-Werkzeuge


kennen:include:chrono

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

kennen:include:chrono [2015-01-26 14:41] (aktuell)
Zeile 1: Zeile 1:
 +====== <​chrono>​ ======
 +Die Bibliothek definiert Typen für [[#​Zeitspannen]],​ [[#​Zeitpunkte]] und [[#Uhren]] im Namensraum ''​std::​chrono''​ unabhängig von den im Lauf der Jahrzehnte immer mehr verkürzten Rechnertakten.
 +
 +===== Zeitspannen =====
 +Zeitspannen der Schablone ''​duration<​Tickzahl,​ Zeiteinheit>''​ werden als Zahlen (Ticks) einer Zeiteinheit dargestellt.
 +Die Typen ''​hours'',​ ''​minutes'',​ ''​seconds'',​ ''​milliseconds'',​ ''​microseconds'',​ ''​nanoseconds''​ sind als Ganzzahlverhältnisse [[ratio|std::​ratio<​z,​n>​]] von Sekunden definiert.
 +
 +<code cpp>
 +#include <​chrono>​
 +
 +double bilderProTag()
 +{
 +  using namespace std::​chrono;​
 +  seconds day = hours(23) + minutes(56) + seconds(4);
 +  milliseconds ms = day;
 +  duration<​double,​ std::​ratio<​1,​24>>​ pics = day;
 +  return pics.count(); ​
 +}
 +</​code>​
 +Grundrechenoperationen und Vergleiche erfolgen weitgehend beim Übersetzen. ​
 +Die Umrechnung in kleinere Zeitspanne-Einheiten ist immer möglich, umgekehrt jedoch nur in Gleitkommatypen oder durch einen [[..:​lib:​duration_cast|Cast]]:​
 +<code cpp>
 +nanoseconds ns = ms;
 +minutes m = duration_cast<​minutes>​(ms);​ // abrunden
 +</​code>​
 +
 +===== Uhren =====
 +Die Zeitmessung mit einer Uhr geht von einem willkürlich festgelegten Anfangszeitpunkt (Epoche) aus.
 +Jede Uhrklasse besitzt einen Zahltyp ''​rep'',​ einen Verhältniszahltyp ''​period'',​ einen Zeitdauertyp ''​duration'',​
 +einen Typ für Zeitpunkte ''​time_point''​ und eine statische Klassenfunktion ''​now()'', ​
 +die den aktuellen Zeitpunkt als Zeitspanne seit Beginn der Epoche liefert.
 +
 +Die Uhrtypen ''​system_clock''​ und ''​high_resolution_clock''​ sind vordefiniert.
 +Bei ''​steady_clock''​ sind zudem garantiert, dass die von ihr nacheinander gelieferten Zeitpunkte niemals "​rückwärts"​ laufen.
 +
 +Die Auflösegenauigkeit einer Uhr kann weniger als eine Nanosekunde betragen:
 +<code cpp>
 +template <class Clock>
 +double precision_in_nanoseconds()
 +{
 +  Clock::​duration tick(1);
 +  std::​chrono::​duration<​double,​ std::​nano>​ ns = tick;
 +  return ns.count();
 +}
 +</​code>​
 +
 +===== Zeitpunkte =====
 +Zeitpunkte ''​time_point<​Uhr,​ Zeitspanne>''​ sind auf ihre Uhr bezogen:
 +
 +<code cpp>
 +template <class Clock>
 +Clock::rep ticks()
 +{
 +  typename Clock::​time_point epoch, now = Clock::​now();​
 +  typename Clock::​duration gone = now.time_since_epoch();​
 +  return gone.count();​
 +}
 +</​code>​
 +Die Differenz zweier Zeitpunkte ist die Zeitspanne ''​d = t2-t1''​.
 +Zu einem Zeitpunkt lässt sich eine Zeitspanne addieren oder subtrahieren.
 +Dies liefert wiederum einen Zeitpunkt ''​t2 = t1+d''​.
 +Vergleiche ''​t1 < t2''​ erlauben Formulierungen wie "​davor"​ und "​danach"​.
 +===== Umwandlung in Zeitstempel =====
 +Die Umwandlung in ein Datum und die Anzeige sind in ''<​chrono>''​ nicht festgelegt.
 +Dafür muss auf die Mittel der Bibliothek [[ctime]] und I/​O-Manipulatoren zurückgegriffen werden:
 +
 +<code cpp>
 +#include <​iostream>​
 +#include <​iomanip>​ // put_time()
 +
 +void vorbei()
 +{
 +  using namespace std::​chrono;​
 +  system_clock::​time_point gestern = system_clock::​now() - hours(24);
 +  std::time_t t = system_clock::​to_time_t(gestern);​
 +  ​
 +  std::cout << "​gestern zur selben Zeit: " << std::​put_time(std::​localtime(&​t),​ "%F %T") << '​\n';​
 +
 +</​code>​
  
kennen/include/chrono.txt · Zuletzt geändert: 2015-01-26 14:41 (Externe Bearbeitung)