[英]chrono duration_cast not working when doing arithmetic in cout
我不明白以下行為
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
//some code here
std::cout << "time diff with arithmetic in cout: " << \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time << std::endl;
unsigned long time_diff = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() - begin_time;
std::cout << "time_diff: " << time_diff << std::endl;
輸出:
time diff with arithmetic in cout: <very large number (definitely not milliseconds)>
time_diff: <smaller number (definitely milliseconds)>
當我在cout中進行算術運算時,為什么duration_cast
不起作用? 我已經使用unsigned int
和int
作為time_diff
變量,但是當我在變量初始化或賦值中首次執行算術時,我總是得到良好的輸出。
注意
我正在使用Visual Studio 2013(社區版)
你可能溢出unsigned long
(sizeof是4):
unsigned long begin_time = \
std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count();
推薦的:
using namespace std::chrono;
auto begin_time = steady_clock::now();
//some code here
std::cout << "time diff with arithmetic in cout: " <<
duration_cast<milliseconds>(steady_clock::now() - begin_time).count() << std::endl;
duration_cast
沒有任何問題,問題是unsigned long
不足以處理自紀元以來毫秒級的時間。 從ideone我得到這個輸出:
Max value for `unsigned long`: 4294967295
Milliseconds since epoch: 15426527488
我通過直接輸出獲得毫秒數:
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now().time_since_epoch()).count() << std::endl;
在你的第一個輸出中,你得到一個巨大的數字,因為begin_time
被begin_time
為std::chrono::milliseconds::rep
begin_time
std::chrono::milliseconds::rep
(返回類型為.count()
),它足以處理time_since_epoch
(由標准保證),在第二個輸出中,兩個值都被unsigned long
截斷,因此得到(可能)正確的結果。
注意:可能存在一種體系結構,其中unsigned long
足以處理此問題,但您不應該依賴它並直接使用為std::chrono::duration
提供的算術運算符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.