2013-07-01 104 views
5

我想擁有自紀元以來的毫秒數。一種流行的解決方案看起來像是遵循與輸出C++ chrono duration_cast以毫秒爲單位的結果秒數

1372686001 

g++g++ -std=c++11 main.cpp -o timetest的調用導致編譯這個

#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; 
} 

(這個問題問這裏Get time since epoch in milliseconds, preferably using C++11 chrono的解決方案之一),這等於自誕生以來!

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

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

更新:它使用G ++ 4.8時的工作原理。所以這是一個海灣合作委員會的錯誤?!

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

做工精細這裏:http://coliru.stacked-crooked.com/view?id=58cbeec8ffe15b00c4c5617e5c661e44-95b421f505320e75ab053309436f3288 –

+0

@ R.MartinhoFernandes你使用相同的G ++和glibc版本? – example

+0

我編輯了鏈接以包含'g ++ -v'(它是4.8.1)的輸出。這意味着如果它是一個錯誤,它是固定的。 –

回答

11

我認爲發生的事情是,你正在用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的正確版本。

+0

輝煌。到目前爲止,我從來沒有注意到這一點(有點討厭它是必須誠實的)......我本來以爲這是新版本號的足夠原因(顯然不同版本的libc是不兼容的! )但是...感謝您爲我清理它 – example

+1

在它們的默認配置中,這些庫是兼容的,其中一個編譯器必須使用「--enable-libstdcxx-time」構建,它改變了庫ABI,在這種情況下,您的工作是避免混合不兼容的庫。 –

相關問題