該標準規定std::chrono::system_clock
如下:
23.17.7.1類SYSTEM_CLOCK [time.clock.system]類SYSTEM_CLOCK的
對象表示來自全系統的實時時鐘掛鐘時間。
這具有多重含義。首先,通過std::chrono::system_clock::to_time_t
和std::chrono::system_clock::from_time_t
可以將此時鐘的時間點轉換爲time_t
或從time_t
轉換爲時間點,暗示時鐘表示某種物理時間。其次,時鐘被指定爲「系統範圍」,這意味着所有進程都應該從該時鐘檢索相同的time_point
值。
實際上,這意味着這個時鐘通常是通過調用特定於操作系統的函數來實現的,這些函數可以檢索某種時間,例如您可以在任務欄中看到的那樣。
請注意,如果此時鐘is_steady
未指定。這意味着從這個時鐘的timepoints
不必總是前進。即使呼叫在實際時間稍後發生,您也可以獲得較早的時間點。例如,如果用戶通過某種操作系統設置調整了時鐘,就會發生這種情況。
什麼是更接近你所描述的是std::chrono::steady_clock
:
23.17.7.2類steady_clock [time.clock.steady]
類steady_clock的對象代表的時鐘其time_point值不會減少隨着物理時間的增加以及時間點相對於實時的穩定速率的增加。
我們提到了兩個要求。首先,時鐘必須是單調的,所以時間永遠不會「倒退」。其次,時鐘是穩定的,所以這個時鐘的每個時鐘都應該花費相同的物理時間。
用像循環計數器這樣的硬件計數器來實現這個時鐘感覺很自然。但要小心:這個時鐘不一定是系統範圍的。這是一個值,例如,從當前正在執行的CPU中獲取,即使其他CPU可能具有不同的計數器。
您是否有特定的實現? – chris
@chris你能詳細說明你的意思嗎?你的意思是像x86一樣的實現與arm還是代碼實現? – Greg
最值得注意的是操作系統,因爲計時庫可能簡單地委託給一個操作系統調用來獲取自時代以來的系統時間。例如,Windows具有'GetSystemTime'。這個標準很少會對細節有直接的瞭解,因爲它限制了什麼樣的系統可以實現它。 – chris