簡體   English   中英

在cout中進行算術運算時,chrono duration_cast無效

[英]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 intint作為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_timebegin_timestd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM