std::chrono::duration_cast
来自cppreference.com
在标头 <chrono> 定义 | ||
template<class ToDuration, class Rep, class Period > constexpr ToDuration duration_cast(conststd::chrono::duration<Rep, Period>& d ); | (C++11 起) | |
将 std::chrono::duration 转换成不同类型 ToDuration
的时长。
只有 ToDuration
是 std::chrono::duration 的特化的情况下,此函数才会参与重载决议。
设
ToRep
为 typename ToDuration::rep,ToPeriod
为 typename ToDuration::period,CF
为 std::ratio_divide<Period, ToPeriod>,CR
为 std::common_type<Rep, ToRep, std::intmax_t>::type,- cr_count 为 static_cast<CR>(d.count()),
- cr_num 为 static_cast<CR>(CF::num),以及
- cr_den 为 static_cast<CR>(CF::den),
那么结果是:
CF::num | |||
---|---|---|---|
1 | 非 1 | ||
CF::den | 1 | ToDuration(static_cast<ToRep> (d.count())) | ToDuration(static_cast<ToRep> (cr_count * cr_num)) |
非 1 | ToDuration(static_cast<ToRep> (cr_count / cr_den)) | ToDuration(static_cast<ToRep> (cr_count * cr_num / cr_den)) |
目录 |
[编辑]参数
d | - | 要转换的时长 |
[编辑]返回值
d 转换成 ToDuration
类型后的时长。
[编辑]注解
不使用隐式转换。如果在编译时已知一或多个参数为 1,那么就会尽可能避免乘法和除法。以最宽的可用类型进行计算,并如同只在完成时用 static_cast 转换为结果类型。
在源周期能被目标周期精确整除的场合(例如小时到分钟),浮点时长和整数时长间转型能经由 std::chrono::duration
构造函数隐式进行,无需 duration_cast
。
从浮点时长转型到整数时长,在浮点值为 NaN、无穷大或过大而无法以目标的整数类型表示时,导致未定义行为。否则转型到整数时长将进行截断,同任何 static_cast 为整数类型一样。
[编辑]示例
此示例度量函数的执行时间。
运行此代码
#include <chrono>#include <iostream>#include <ratio>#include <thread> void f(){std::this_thread::sleep_for(std::chrono::seconds(1));} int main(){constauto t1 =std::chrono::high_resolution_clock::now(); f();constauto t2 =std::chrono::high_resolution_clock::now(); // 浮点时长:不需要 duration_castconststd::chrono::duration<double, std::milli> fp_ms = t2 - t1; // 整数时长:必须 duration_castconstauto int_ms = std::chrono::duration_cast<std::chrono::milliseconds>(t2 - t1); // 将整数时长转换为更短可整除的时间单位的整数时长:不需要 duration_castconststd::chrono::duration<long, std::micro> int_usec = int_ms; std::cout<<"f() 用了 "<< fp_ms <<",或 "<< int_ms <<"(整毫秒),或"<< int_usec <<"(整微秒)\n";}
可能的输出:
f() 用了 1000.14ms,或 1000ms(整毫秒),或 1000000us(整微秒)
[编辑]参阅
(C++11) | 时间区间 (类模板) |
(C++11) | 转换时间点为同一时钟上拥有不同时长的另一时间点 (函数模板) |
(C++17) | 以向下取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) | 以向上取整的方式,将一个时长转换为另一个时长 (函数模板) |
(C++17) | 转换时长到另一个时长,就近取整,偶数优先 (函数模板) |