<chrono>頭文件作為time_point
的提供者,具有代表時間點的類,duration類和時鐘類。每個時鐘都有一個is_steady
靜態(tài)數(shù)據(jù)成員,這個成員用來表示該時鐘是否是一個穩(wěn)定的時鐘(以勻速計時的時鐘,且不可調(diào)節(jié))。std::chrono::steady_clock
是唯一個能保證穩(wěn)定的時鐘類。
頭文件正文
namespace std
{
namespace chrono
{
template<typename Rep,typename Period = ratio<1>>
class duration;
template<
typename Clock,
typename Duration = typename Clock::duration>
class time_point;
class system_clock;
class steady_clock;
typedef unspecified-clock-type high_resolution_clock;
}
}
std::chrono::duration
類模板可以用來表示時間。模板參數(shù)Rep
和Period
是用來存儲持續(xù)時間的數(shù)據(jù)類型,std::ratio
實例代表了時間的長度(幾分之一秒),其表示了在兩次“時鐘滴答”后的時間(時鐘周期)。因此,std::chrono::duration<int, std::milli>
即為,時間以毫秒數(shù)的形式存儲到int類型中,而std::chrono::duration<short, std::ratio<1,50>>
則是記錄1/50秒的個數(shù),并將個數(shù)存入short類型的變量中,還有std::chrono::duration <long long, std::ratio<60,1>>
則是將分鐘數(shù)存儲到long long類型的變量中。
template <class Rep, class Period=ratio<1> >
class duration
{
public:
typedef Rep rep;
typedef Period period;
constexpr duration() = default;
~duration() = default;
duration(const duration&) = default;
duration& operator=(const duration&) = default;
template <class Rep2>
constexpr explicit duration(const Rep2& r);
template <class Rep2, class Period2>
constexpr duration(const duration<Rep2, Period2>& d);
constexpr rep count() const;
constexpr duration operator+() const;
constexpr duration operator-() const;
duration& operator++();
duration operator++(int);
duration& operator--();
duration operator--(int);
duration& operator+=(const duration& d);
duration& operator-=(const duration& d);
duration& operator*=(const rep& rhs);
duration& operator/=(const rep& rhs);
duration& operator%=(const rep& rhs);
duration& operator%=(const duration& rhs);
static constexpr duration zero();
static constexpr duration min();
static constexpr duration max();
};
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator!=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);
要求
Rep
必須是內(nèi)置數(shù)值類型,或是自定義的類數(shù)值類型。
Period
必須是std::ratio<>
實例。
用來記錄dration
中時鐘周期的數(shù)量。
聲明
typedef Rep rep;
rep
類型用來記錄duration
對象內(nèi)部的表示。
這個類型必須是一個std::ratio
的特化實例,用來表示在繼續(xù)時間中,1s所要記錄的次數(shù)。例如,當(dāng)period
是std::ratio<1, 50>
,duration
變量的count()就會在N秒鐘返回50N。
聲明
typedef Period period;
使用默認值構(gòu)造std::chrono::duration
實例
聲明
constexpr duration() = default;
效果
duration
內(nèi)部值(例如rep
類型的值)都已初始化。
通過給定的數(shù)值來構(gòu)造std::chrono::duration
實例。
聲明
template <class Rep2>;
constexpr explicit duration(const Rep2& r);
效果
duration
對象的內(nèi)部值會使用static_cast<rep>(r)
進行初始化。
結(jié)果
當(dāng)Rep2隱式轉(zhuǎn)換為Rep,Rep是浮點類型或Rep2不是浮點類型,這個構(gòu)造函數(shù)才能使用。
后驗條件
this->count()==static_cast<rep>(r)
通過另一個std::chrono::duration
類實例中的計數(shù)值來構(gòu)造一個std::chrono::duration
類實例。
聲明
template <class Rep2, class Period>
constexpr duration(const duration<Rep2,Period2>& d);
結(jié)果
duration對象的內(nèi)部值通過duration_cast<duration<Rep,Period>>(d).count()
初始化。
要求
當(dāng)Rep是一個浮點類或Rep2不是浮點類,且Period2是Period數(shù)的倍數(shù)(比如,ratio_divide<Period2,Period>::den==1)時,才能調(diào)用該重載。當(dāng)一個較小的數(shù)據(jù)轉(zhuǎn)換為一個較大的數(shù)據(jù)時,使用該構(gòu)造函數(shù)就能避免數(shù)位截斷和精度損失。
后驗條件
this->count() == dutation_cast<duration<Rep, Period>>(d).count()
例子
duration<int, ratio<1, 1000>> ms(5); // 5毫秒
duration<int, ratio<1, 1>> s(ms); // 錯誤:不能將ms當(dāng)做s進行存儲
duration<double, ratio<1,1>> s2(ms); // 合法:s2.count() == 0.005
duration<int, ration<1, 1000000>> us<ms>; // 合法:us.count() == 5000
查詢持續(xù)時長。
聲明
constexpr rep count() const;
返回
返回duration的內(nèi)部值,其值類型和rep一樣。
這是一個空操作:只會返回*this的副本。
聲明
constexpr duration operator+() const;
返回
*this
返回將內(nèi)部值只為負數(shù)的*this副本。
聲明
constexpr duration operator-() const;
返回
duration(--this->count());
增加內(nèi)部計數(shù)值。
聲明
duration& operator++();
結(jié)果
++this->internal_count;
返回
*this
自加內(nèi)部計數(shù)值,并且返回還沒有增加前的*this。
聲明
duration operator++(int);
結(jié)果
duration temp(*this);
++(*this);
return temp;
自減內(nèi)部計數(shù)值
聲明
duration& operator--();
結(jié)果
--this->internal_count;
返回
*this
自減內(nèi)部計數(shù)值,并且返回還沒有減少前的*this。
聲明
duration operator--(int);
結(jié)果
duration temp(*this);
--(*this);
return temp;
將其他duration對象中的內(nèi)部值增加到現(xiàn)有duration對象當(dāng)中。
聲明
duration& operator+=(duration const& other);
結(jié)果
internal_count+=other.count();
返回
*this
現(xiàn)有duration對象減去其他duration對象中的內(nèi)部值。
聲明
duration& operator-=(duration const& other);
結(jié)果
internal_count-=other.count();
返回
*this
內(nèi)部值乘以一個給定的值。
聲明
duration& operator*=(rep const& rhs);
結(jié)果
internal_count*=rhs;
返回
*this
內(nèi)部值除以一個給定的值。
聲明
duration& operator/=(rep const& rhs);
結(jié)果
internal_count/=rhs;
返回
*this
內(nèi)部值對一個給定的值求余。
聲明
duration& operator%=(rep const& rhs);
結(jié)果
internal_count%=rhs;
返回
*this
內(nèi)部值對另一個duration類的內(nèi)部值求余。
聲明
duration& operator%=(duration const& rhs);
結(jié)果
internal_count%=rhs.count();
返回
*this
返回一個內(nèi)部值為0的duration對象。
聲明
constexpr duration zero();
返回
duration(duration_values<rep>::zero());
返回duration類實例化后能表示的最小值。
聲明
constexpr duration min();
返回
duration(duration_values<rep>::min());
返回duration類實例化后能表示的最大值。
聲明
constexpr duration max();
返回
duration(duration_values<rep>::max());
比較兩個duration對象是否相等。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator==(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
結(jié)果
當(dāng)CommonDuration
和std::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type
同類,那么lhs==rhs
就會返回CommonDuration(lhs).count()==CommonDuration(rhs).count()
。
比較兩個duration對象是否不相等。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator!=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
返回
!(lhs==rhs)
比較兩個duration對象是否小于。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
結(jié)果
當(dāng)CommonDuration
和std::common_type< duration< Rep1, Period1>, duration< Rep2, Period2>>::type
同類,那么lhs<rhs
就會返回CommonDuration(lhs).count()<CommonDuration(rhs).count()
。
比較兩個duration對象是否大于。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
返回
rhs<lhs
比較兩個duration對象是否小于等于。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator<=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
返回
!(rhs<lhs)
比較兩個duration對象是否大于等于。
聲明
template <class Rep1, class Period1, class Rep2, class Period2>
constexpr bool operator>=(
const duration<Rep1, Period1>& lhs,
const duration<Rep2, Period2>& rhs);
要求
lhs
和rhs
兩種類型可以互相進行隱式轉(zhuǎn)換。當(dāng)兩種類型無法進行隱式轉(zhuǎn)換,或是可以互相轉(zhuǎn)換的兩個不同類型的duration類,則表達式不合理。
返回
!(lhs<rhs)
顯示將一個std::chrono::duration
對象轉(zhuǎn)化為另一個std::chrono::duration
實例。
聲明
template <class ToDuration, class Rep, class Period>
constexpr ToDuration duration_cast(const duration<Rep, Period>& d);
要求
ToDuration必須是std::chrono::duration
的實例。
返回
duration類d轉(zhuǎn)換為指定類型ToDuration。這種方式可以在不同尺寸和表示類型的轉(zhuǎn)換中盡可能減少精度損失。
std::chrono::time_point
類型模板通過(特別的)時鐘來表示某個時間點。這個時鐘代表的是從epoch(1970-01-01 00:00:00 UTC,作為UNIX系列系統(tǒng)的特定時間戳)到現(xiàn)在的時間。模板參數(shù)Clock代表使用的使用(不同的使用必定有自己獨特的類型),而Duration模板參數(shù)使用來測量從epoch到現(xiàn)在的時間,并且這個參數(shù)的類型必須是std::chrono::duration
類型。Duration默認存儲Clock上的測量值。
template <class Clock,class Duration = typename Clock::duration>
class time_point
{
public:
typedef Clock clock;
typedef Duration duration;
typedef typename duration::rep rep;
typedef typename duration::period period;
time_point();
explicit time_point(const duration& d);
template <class Duration2>
time_point(const time_point<clock, Duration2>& t);
duration time_since_epoch() const;
time_point& operator+=(const duration& d);
time_point& operator-=(const duration& d);
static constexpr time_point min();
static constexpr time_point max();
};
構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時間;其內(nèi)部計時使用Duration::zero()進行初始化。
聲明
time_point();
后驗條件
對于使用默認構(gòu)造函數(shù)構(gòu)造出的time_point對象tp,tp.time_since_epoch() == tp::duration::zero()
。
構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時間。
聲明
explicit time_point(const duration& d);
后驗條件
當(dāng)有一個time_point對象tp,是通過duration d構(gòu)造出來的(tp(d)),那么tp.time_since_epoch() == d
。
構(gòu)造time_point代表著,使用相關(guān)的Clock,記錄從epoch到現(xiàn)在的時間。
聲明
template <class Duration2>
time_point(const time_point<clock, Duration2>& t);
要求
Duration2必須呢個隱式轉(zhuǎn)換為Duration。
效果
當(dāng)time_point(t.time_since_epoch())
存在,從t.time_since_epoch()中獲取的返回值,可以隱式轉(zhuǎn)換成Duration類型的對象,并且這個值可以存儲在一個新的time_point對象中。
(擴展閱讀:as-if準則)
返回當(dāng)前time_point從epoch到現(xiàn)在的具體時長。
聲明
duration time_since_epoch() const;
返回
duration的值存儲在*this中。
將指定的duration的值與原存儲在指定的time_point對象中的duration相加,并將加后值存儲在*this對象中。
聲明
time_point& operator+=(const duration& d);
效果
將d的值和duration對象的值相加,存儲在*this中,就如同this->internal_duration += d;
返回
*this
將指定的duration的值與原存儲在指定的time_point對象中的duration相減,并將加后值存儲在*this對象中。
聲明
time_point& operator-=(const duration& d);
效果
將d的值和duration對象的值相減,存儲在*this中,就如同this->internal_duration -= d;
返回
*this
獲取time_point對象可能表示的最小值。
聲明
static constexpr time_point min();
返回
time_point(time_point::duration::min()) (see 11.1.1.15)
獲取time_point對象可能表示的最大值。
聲明
static constexpr time_point max();
返回
time_point(time_point::duration::max()) (see 11.1.1.16)
std::chrono::system_clock
類提供給了從系統(tǒng)實時時鐘上獲取當(dāng)前時間功能??梢哉{(diào)用std::chrono::system_clock::now()
來獲取當(dāng)前的時間。std::chrono::system_clock::time_point
也可以通過std::chrono::system_clock::to_time_t()
和std::chrono::system_clock::to_time_point()
函數(shù)返回值轉(zhuǎn)換成time_t類型。系統(tǒng)時鐘不穩(wěn)定,所以std::chrono::system_clock::now()
獲取到的時間可能會早于之前的一次調(diào)用(比如,時鐘被手動調(diào)整過或與外部時鐘進行了同步)。
class system_clock
{
public:
typedef unspecified-integral-type rep;
typedef std::ratio<unspecified,unspecified> period;
typedef std::chrono::duration<rep,period> duration;
typedef std::chrono::time_point<system_clock> time_point;
static const bool is_steady=unspecified;
static time_point now() noexcept;
static time_t to_time_t(const time_point& t) noexcept;
static time_point from_time_t(time_t t) noexcept;
};
將時間周期數(shù)記錄在一個duration值中
聲明
typedef unspecified-integral-type rep;
類型為std::ratio
類型模板,通過在兩個不同的duration或time_point間特化最小秒數(shù)(或?qū)?秒分為好幾份)。period指定了時鐘的精度,而非時鐘頻率。
聲明
typedef std::ratio<unspecified,unspecified> period;
類型為std::ratio
類型模板,通過系統(tǒng)實時時鐘獲取兩個時間點之間的時長。
聲明
typedef std::chrono::duration<
std::chrono::system_clock::rep,
std::chrono::system_clock::period> duration;
類型為std::ratio
類型模板,通過系統(tǒng)實時時鐘獲取當(dāng)前時間點的時間。
聲明
typedef std::chrono::time_point<std::chrono::system_clock> time_point;
從系統(tǒng)實時時鐘上獲取當(dāng)前的外部設(shè)備顯示的時間。
聲明
time_point now() noexcept;
返回
time_point類型變量來代表當(dāng)前系統(tǒng)實時時鐘的時間。
拋出
當(dāng)錯誤發(fā)生,std::system_error
異常將會拋出。
將time_point類型值轉(zhuǎn)化為time_t。
聲明
time_t to_time_t(time_point const& t) noexcept;
返回
通過對t進行舍入或截斷精度,將其轉(zhuǎn)化為一個time_t類型的值。
拋出
當(dāng)錯誤發(fā)生,std::system_error
異常將會拋出。
聲明
time_point from_time_t(time_t const& t) noexcept;
返回
time_point中的值與t中的值一樣。
拋出
當(dāng)錯誤發(fā)生,std::system_error
異常將會拋出。
std::chrono::steady_clock
能訪問系統(tǒng)穩(wěn)定時鐘??梢酝ㄟ^調(diào)用std::chrono::steady_clock::now()
獲取當(dāng)前的時間。設(shè)備上顯示的時間,與使用std::chrono::steady_clock::now()
獲取的時間沒有固定的關(guān)系。穩(wěn)定時鐘是無法回調(diào)的,所以在std::chrono::steady_clock::now()
兩次調(diào)用后,第二次調(diào)用獲取的時間必定等于或大于第一次獲得的時間。時鐘以固定的速率進行計時。
class steady_clock
{
public:
typedef unspecified-integral-type rep;
typedef std::ratio<
unspecified,unspecified> period;
typedef std::chrono::duration<rep,period> duration;
typedef std::chrono::time_point<steady_clock>
time_point;
static const bool is_steady=true;
static time_point now() noexcept;
};
定義一個整型,用來保存duration的值。
聲明
typedef unspecified-integral-type rep;
類型為std::ratio
類型模板,通過在兩個不同的duration或time_point間特化最小秒數(shù)(或?qū)?秒分為好幾份)。period指定了時鐘的精度,而非時鐘頻率。
聲明
typedef std::ratio<unspecified,unspecified> period;
類型為std::ratio
類型模板,通過系統(tǒng)實時時鐘獲取兩個時間點之間的時長。
聲明
typedef std::chrono::duration<
std::chrono::system_clock::rep,
std::chrono::system_clock::period> duration;
std::chrono::time_point
類型實例,可以存儲從系統(tǒng)穩(wěn)定時鐘返回的時間點。
聲明
typedef std::chrono::time_point<std::chrono::steady_clock> time_point;
從系統(tǒng)穩(wěn)定時鐘獲取當(dāng)前時間。
聲明
time_point now() noexcept;
返回
time_point表示當(dāng)前系統(tǒng)穩(wěn)定時鐘的時間。
拋出
當(dāng)遇到錯誤,會拋出std::system_error
異常。
同步
當(dāng)先行調(diào)用過一次std::chrono::steady_clock::now()
,那么下一次time_point獲取的值,一定大于等于第一次獲取的值。
td::chrono::high_resolution_clock
類能訪問系統(tǒng)高精度時鐘。和所有其他時鐘一樣,通過調(diào)用std::chrono::high_resolution_clock::now()
來獲取當(dāng)前時間。std::chrono::high_resolution_clock
可能是std::chrono::system_clock
類或std::chrono::steady_clock
類的別名,也可能就是獨立的一個類。
通過std::chrono::high_resolution_clock
具有所有標準庫支持時鐘中最高的精度,這就意味著使用
std::chrono::high_resolution_clock::now()
要花掉一些時間。所以,當(dāng)你再調(diào)用std::chrono::high_resolution_clock::now()
的時候,需要注意函數(shù)本身的時間開銷。
class high_resolution_clock
{
public:
typedef unspecified-integral-type rep;
typedef std::ratio<
unspecified,unspecified> period;
typedef std::chrono::duration<rep,period> duration;
typedef std::chrono::time_point<
unspecified> time_point;
static const bool is_steady=unspecified;
static time_point now() noexcept;
};