簡體   English   中英

C ++ chrono duration_cast轉換為毫秒,以秒為單位

[英]c++ chrono duration_cast to milliseconds results in seconds

我想要自紀元以來的毫秒數。 一個流行的解決方案如下所示(此問題的一種解決方案在這里獲取自紀元以來的時間,以毫秒為單位,最好使用C ++ 11 chrono

#include <iostream>
#include <chrono>

int main() {
    auto millitime = std::chrono::duration_cast<std::chrono::milliseconds>
        (std::chrono::system_clock::now().time_since_epoch()).count();
    std::cout << millitime << std::endl;
    return 0;
}

通過對g++的調用(例如g++ -std=c++11 main.cpp -o timetest ,將在輸出中顯示

1372686001

這等於距紀元以來的秒數

這是glibc中的錯誤嗎? 在g ++中? 我的錯?

g++ (Debian 4.7.3-4) 4.7.3
ldd (Debian EGLIBC 2.17-6) 2.17

更新:使用g ++ 4.8時可以使用。 那是gcc錯誤嗎?

g++-4.8 (Debian 4.8.1-2) 4.8.1

我認為正在發生的事情是您正在使用GCC 4.7進行編譯,但是運行時鏈接程序使用的是來自其他GCC版本的libstdc++.so ,並且為std::chrono:system_clock配置了不同的精度。 如果使用LD_LIBRARY_PATH或適當的鏈接器選項來確保您使用GCC 4.7進行編譯使用其libstdc++.so則結果應正確。

例如:

$ $HOME/gcc/4.7.1/bin/g++ -std=c++11 t.cc
$ ./a.out
1372693222
$ LD_LIBRARY_PATH=$HOME/gcc/4.7.1/lib64 ./a.out
1372693225128

之所以會發生差異,是因為對system_clock::now()的調用位於libstdc++.so庫中,因此結果取決於運行時使用的是哪個庫,但是從該值到millisecondsduration_cast轉換是通過內聯模板完成的,在編譯時實例化。 如果編譯時轉換與運行時調用不一致,則結果不一致。

對於GCC 4.8.1,對system_clock實現進行了改進,使其始終使用clock_gettime系統調用(如果可用),而4.7則不是這樣,因此無論如何配置GCC,它始終使用高精度時鍾,這可能解釋了為什么您看不到4.8.1的問題。

您應該始終確保在運行時使用正確版本的libstdc++.so

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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