![](/img/trans.png)
[英]Precision of std::chrono::system_clock vs std::chrono::steady_clock across C++ implementations?
[英]mismatched types 'std::chrono::_V2::steady_clock' and 'std::chrono::_V2::system_clock'
我正在尝试在mingw64 (GCC v11.2) 中构建我的程序。 我有以下结构:
在 header 文件中:
struct Timer
{
std::chrono::time_point< std::chrono::steady_clock > start;
std::chrono::time_point< std::chrono::steady_clock > end;
Timer( );
~Timer( );
};
在源文件中:
util::Timer::Timer( )
: start( std::chrono::high_resolution_clock::now( ) )
{
}
util::Timer::~Timer( )
{
end = std::chrono::high_resolution_clock::now( );
std::chrono::duration< double, std::milli > duration_ms { end - start };
std::clog << "\nTimer took " << duration_ms.count( ) << " ms\n";
}
但是会发生这种情况:
error: no matching function for call to 'std::chrono::time_point<std::chrono::_V2::steady_clock, std::chrono::duration<long long int, std::ratio<1, 1000000000> > >::time_point(std::chrono::_V2::system_clock::time_point)'
8 | : start( std::chrono::high_resolution_clock::now( ) )
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In file included from pch.h:23:
c:\mingw64\include\c++\11.2.0\chrono:871:21: note: candidate: 'template<class _Dur2, class> constexpr std::chrono::time_point<_Clock, _Dur>::time_point(const std::chrono::time_point<_Clock, _Dur2>&) [with _Dur2 = _Dur2; <template-parameter-2-2> = <template-parameter-1-2>; _Clock = std::chrono::_V2::steady_clock; _Dur = std::chrono::duration<long long int, std::ratio<1, 1000000000> >]'
871 | constexpr time_point(const time_point<clock, _Dur2>& __t)
| ^~~~~~~~~~
c:\mingw64\include\c++\11.2.0\chrono:871:21: note: template argument deduction/substitution failed:
Util.cpp:8:3: note: mismatched types 'std::chrono::_V2::steady_clock' and 'std::chrono::_V2::system_clock'
8 | : start( std::chrono::high_resolution_clock::now( ) )
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
为什么会这样? 如何解决?
感谢评论中提供的信息,我想出了以下解决方案:
在 header 文件中:
struct Timer
{
std::chrono::time_point< std::chrono::steady_clock > start;
std::chrono::time_point< std::chrono::steady_clock > end;
Timer( );
~Timer( );
};
在源文件中:
util::Timer::Timer( )
: start( std::chrono::steady_clock::now( ) )
{
}
util::Timer::~Timer( )
{
end = std::chrono::steady_clock::now( );
std::clog << "\nTimer took " << std::chrono::duration< double, std::milli >( end - start ).count( ) << " ms\n";
}
所以简而言之,我从std::chrono::high_resolution_clock::now( )
chrono::high_resolution_clock::now( ) 切换到std::chrono::steady_clock::now( )
因为high_resolution_clock
根据high_resolution_clock在不同的编译器上有不同的实现。
在其中一些上它返回std::chrono::time_point<std::chrono::steady_clock>
而在另一些上它返回std::chrono::time_point<std::chrono::system_clock>
。 这给我带来了问题。
来自 cppreference 的注释:
笔记
high_resolution_clock 在不同的标准库实现中的实现不一致,应该避免使用它。 它通常只是 std::chrono::steady_clock 或 std::chrono::system_clock 的别名,但它是哪一个取决于库或配置。 当它是一个system_clock 时,它不是单调的(例如,时间可以go 向后)。 例如,对于 gcc 的 libstdc++,它是 system_clock,对于 MSVC,它是 stable_clock,对于 clang 的 libc++,它取决于配置。
通常,应该直接使用 std::chrono::steady_clock 或 std::chrono::system_clock 而不是 std::chrono::high_resolution_clock:使用 stable_clock 进行持续时间测量,使用 system_clock 进行挂钟时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.