#c #time #c 11 #chrono
#c #время #c 11 #chrono
Вопрос:
У меня глупая проблема. Я пытаюсь переключиться на заголовки c 11, и один из них — chrono. Но моя проблема в том, что я не могу получить результат временных операций. Например:
auto t=std::chrono::high_resolution_clock::now();
cout<<t.time_since_epoch();
дает:
инициализация аргумента 1 из
‘std::basic_ostream<_CharT, _Traits>amp; std::operator<<(std::basic_ostream<_CharT, _Traits>amp;amp;, const _Tpamp;) [with _CharT = char, _Traits = std::char_traits<char>, _Tp = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]’
… /usr/include/c /4.6/ostream
cout<<(uint64_t)t.time_since_epoch();
выдает недопустимое приведение
Ответ №1:
Как отмечали другие, вы можете вызвать count()
функцию-член, чтобы получить внутренний счетчик.
Я хотел добавить, что я пытаюсь добавить новый заголовок: <chrono_io>
в эту библиотеку. Это задокументировано здесь . Главное преимущество <chrono_io>
простого использования count()
заключается в том, что единицы времени компиляции распечатываются для вас. Эту информацию, конечно, можно получить вручную, но гораздо проще просто иметь для нее библиотеку.
Для меня ваш пример:
#include <iostream>
#include <chrono_io>
int main()
{
auto t = std::chrono::high_resolution_clock::now();
std::cout << t.time_since_epoch() << 'n';
}
Выводит:
147901305796958 nanoseconds
Исходный код для этого является открытым исходным кодом и доступен по ссылке выше. Он состоит из двух заголовков: <ratio_io>
и <chrono_io>
, и 1 источника: chrono_io.cpp
.
Этот код следует считать экспериментальным. Он не является стандартным и почти наверняка не будет стандартизирован как есть. Действительно, предварительные комментарии от LWG указывают на то, что они предпочли бы, чтобы вывод по умолчанию был тем, что это программное обеспечение называет «короткой формой». Этот альтернативный вывод может быть получен с помощью:
std::cout << std::chrono::duration_fmt(std::chrono::symbol)
<< t.time_since_epoch() << 'n';
И выводит:
147901305796958 ns
Обновить
Это заняло всего десятилетие, но C 20 теперь делает:
#include <chrono>
#include <iostream>
int main()
{
auto t = std::chrono::high_resolution_clock::now();
std::cout << t.time_since_epoch() << 'n';
}
Вывод:
147901305796958ns
Комментарии:
1. По моему первоначальному вопросу вы можете догадаться, что я не гуру cpp :), но почему бы вам не перегрузить time_since_epoch т.time_since_epoch(chrono::print_unit)
2. В настоящее время на планете очень мало гуру хроно. Так что у вас все просто отлично! 🙂 Возможно, я неправильно понял ваше предложение, но похоже, вы предлагаете установить единицы измерения продолжительности, по крайней мере, для целей печати. Это может привести к тому, что неточные преобразования будут выполняться в автоматическом режиме, что было сложно предотвратить при разработке chrono. Т.Е. Разные типы длительности будут неявно преобразовываться только в том случае, если при преобразовании нет ошибки усечения.
3. Понятно, спасибо. В C традиционно печатать вещи с помощью
stream << object
(это было первое, что вы попробовали). И лучше придерживаться традиций, чтобы не запутать всех (если вы не хотите разработать совершенно новую систему ввода-вывода). Что касается отдельного заголовка, меня можно было бы уговорить включить в него всю функциональность<chrono>
. Это инженерный компромисс (увеличивает время компиляции для многих вариантов использования). График стандартизации: нам очень повезло увидеть<chrono>
в C 11. Вместо этого мы почти получили C12xtime
. Стандартизация намного сложнее, чем дизайн.4. Грустно видеть, что поиск предложений о вводе / выводе chrono не приводит ни к чему, кроме этого ответа. Нам действительно может понадобиться такое дополнение. Также исправлены ваши ссылки, поскольку они были сломаны.
5. Длительность печати теперь указана в спецификации проекта C 20, хотя точный синтаксис и формат отличаются от тех, которые указаны в моем ответе.
Ответ №2:
Быстрый поиск в Google нашел эту страницу: http://en.cppreference.com/w/cpp/chrono/duration , где вы можете найти пример печати длительности.
Редактировать: он был перемещен в http://en.cppreference.com/w/cpp/chrono/duration/duration_cast
Комментарии:
1. я использую эту вики, но я так и не нашел ее … tnx
2. Помните, что связанный пример отличается тем, что он выводит разницу между двумя вызовами now() и не включает time_since_epoch() . Фактически, time_since_epoch оставляет фактическую эпоху неопределенной (это зависит от часов, из которых вы получили time_point). Итак, короче говоря, продолжительность, которую вы печатаете, бессмысленна без сопутствующей информации об эпохе.
Ответ №3:
Если вам нужна синхронизация с разрешением в миллисекунды, вот как вы можете это сделать:
auto t1 = std::chrono::high_resolution_clock::now();
//process to be timed
auto t2 = std::chrono::high_resolution_clock::now();
std::cout << "process took: "
<< std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1).count()
<< " millisecondsn";
Не забудьте добавить среди включенных заголовков:
#include <chrono> //timing
Ответ №4:
Не уверен, чего вы ожидаете от этого приведения, может быть, вы хотели t.time_since_epoch().count()
?