ejemplo - steady_clock c++
Conversión de struct timespec a std:: chrono::? (1)
Tengo una secuencia de valores struct timespec. Me gustaría convertirlos a una representación nativa de C ++ 11, pero estoy totalmente alterado por Chrono. ¿Cuál es el mejor destino y cómo llegar desde una struct timespec o struct timeval ya que es una transformación fácil y microsegundos es lo suficientemente bueno para estos tiempos? Supongo que quiero llegar a esto, ¿verdad? std :: chrono :: system_clock :: time_point
En este caso, el timespec
es el tiempo UNIX desde un GPS. Y sí, están usando un segundo de 4 bytes (formulario convertido firmado en la memoria y luego escrito como sin firmar) que se conseguirá en 2038.
Como referencia, voy a agregar esto al lector C ++ para gsf
A veces veo timespec
y timeval
utilizados como duraciones, y a veces los veo usados como puntos de tiempo. Deberá saber qué tipo de valores tiene. En <chrono>
estos dos conceptos son tipos diferentes.
Una duración es una cantidad de tiempo: algo que medirías con un cronómetro. Las duraciones de los ejemplos son 2 minutos, 3 segundos, 4 horas y 16 años.
Un punto de tiempo es una hora específica: 2pm 14 de julio de 2015 EDT, o 6 horas desde que inicié mi computadora. Un punto de tiempo tiene una época implícita asociada a él. Una época es solo un origen mutuamente acordado con el que estás midiendo el tiempo.
Si su timespec
tiene una duración:
timespec ts = {3, 123}; // 3 seconds + 123 nanoseconds
auto d = std::chrono::seconds{ts.seconds}
+ std::chrono::nanoseconds{ts.nanoseconds};
Si su timespec
tiene un punto de tiempo, debe conocer la época. Es probable que la época sea 1970-01-01 00:00:00 UTC, dejando de lado los segundos intercalares (este es el tiempo Unix ). Si es así, puede ponerlo en std::chrono::system_clock::time_point
. No se garantiza que este tipo tenga esta época, pero cada implementación hace:
using namespace std::chrono;
system_clock::time_point tp{duration_cast<system_clock::duration>(d)};
donde d
se calcula como arriba.
Si tiene un timeval
, entonces use microseconds
donde he usado nanoseconds
.
No puede usar de forma portátil high_resolution_clock
o steady_clock
time_points porque las diferentes implementaciones tienen diferentes épocas para estos tipos.
Además, si está utilizando timeval
, en la práctica el duration_cast
es necesario ya que la duración d
convertirá implícitamente a todas las implementaciones de system_clock::duration
:
using namespace std::chrono;
system_clock::time_point tp{d};
Si no está seguro de si necesita el duration_cast
o no, inténtelo sin él. Si se compila, no lo necesita. Si obtiene un error en tiempo de compilación, lo necesita. Es necesario al convertir duraciones y no hay una conversión exacta.