high_solve_lock::now().time_since_epoch() возвращает существенно разные результаты в Windows и Linux. В Linux он возвращает продолжительность с 1 января 1970 года по настоящее время. В Windows возвращается только продолжительность 21 день.
Я запускал следующий простой код в Windows
#include<iostream>
#include<chrono>
int main(int argc, char** argv)
{
std::cout << std::chrono::high_resolution_clock::now().time_since_epoch().count() << std::endl;
return 0;
}
и результат составил 1819149491213100 нс, что составило всего 21 день. Затем я запустил код в Linux, и он напечатал время с 1 января 1970 года (чего я и ожидал). Я также утомил Stead_Clock, и результаты были аналогичными. Но когда я пробую system_lock, поведение в обеих ОС оказывается одинаковым.
Почему этот код ведет себя по-разному в разных ОС? Результаты показывают, что Windows и Linux используют разные эпохи, но откуда взялся этот 21 день? Означает ли такое различное поведение, что нам следует использовать high_solve_lock не для временных меток, а только для вычислений продолжительности?
PS: Я запускал код в Visual Studio 2022.
обновлять:
После перезагрузки моего компьютера время эпохи high_resolusion_lock сбрасывается!
Вот документ Stead_Clock из cppreference:
Steady_lock не связан со временем настенных часов (например, это может быть время с момента последней перезагрузки) и наиболее подходит для измерения интервалов.
В моем случае я предполагаю, что high_solve_lock — это просто псевдоним Steady_Clock.
Связано: stackoverflow.com/q/37426832/11910702 Но да, для gcc в Linux high_resolution_clock
— это псевдоним system_clock
. Для MSVC это псевдоним steady_clock
(см. Learn.microsoft.com/en-us/cpp/standard-library/…).
Из cppreference:
Класс
std::chrono::high_resolution_clock
представляет часы с наименьшим периодом такта, предусмотренным реализацией. Это может быть псевдонимstd::chrono::system_clock
илиstd::chrono::steady_clock
или третьи независимые часы.
И std::system_lock имел неуказанную эпоху до C++20. Поскольку С++ 20 это
[...] Время Unix (т. е. время с 00:00:00 всемирного координированного времени (UTC) четверга, 1 января 1970 года, не считая дополнительных секунд).
С другой стороны, std::steady_lock имеет неопределенную эпоху, поскольку его основная цель — измерение разницы во времени:
Эти часы не связаны со временем настенных часов (например, это может быть время с момента последней перезагрузки) и наиболее подходят для измерения интервалов.
«Третьи независимые часы» могут иметь совершенно другую эпоху.
Большое спасибо за объяснение! Я нашел следующие заметки о cppreference: std::chrono::high_relsolution_lock часто является просто псевдонимом для std::chrono::steady_lock или std::chrono::system_lock, ... например, по состоянию на 2023 год он есть в MSVC. как устойчивые_часы. А в документации к Steady_lock: std::chrono::steady_lock не связано со временем на настенных часах (например, это может быть время с момента последней перезагрузки) и наиболее подходит для измерения интервалов. Поэтому я перезагрузил свой компьютер и повторно запустил код, и время эпохи было сброшено!
Вы уверены, что в случае использования 32-битных временных меток не происходит целочисленного переполнения?