Разное поведение high_solve_lock в Windows и Linux

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.

Вы уверены, что в случае использования 32-битных временных меток не происходит целочисленного переполнения?

Quimby 05.06.2024 10:56

Связано: stackoverflow.com/q/37426832/11910702 Но да, для gcc в Linux high_resolution_clock — это псевдоним system_clock. Для MSVC это псевдоним steady_clock (см. Learn.microsoft.com/en-us/cpp/standard-library/…).

Erel 05.06.2024 13:36
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из 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 не связано со временем на настенных часах (например, это может быть время с момента последней перезагрузки) и наиболее подходит для измерения интервалов. Поэтому я перезагрузил свой компьютер и повторно запустил код, и время эпохи было сброшено!

Joachim Zhang 05.06.2024 12:37

Другие вопросы по теме