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