c ++ chrono duration_cast到毫秒的结果以秒为单位

时间:2013-07-01 13:45:51

标签: c++ c++11 chrono

我想拥有自纪元以来的毫秒数。一个流行的解决方案如下所示(此问题的解决方案之一是Get time since epoch in milliseconds, preferably using 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 bug?!

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

1 个答案:

答案 0 :(得分: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库中,因此结果取决于在运行时使用的库,但duration_cast从该值转换为milliseconds由内联模板完成,这些模板在编译时实例化。如果编译时转换与运行时调用不一致,则结果不一致。

对于GCC 4.8.1,system_clock实现已得到改进,如果可用,则始终使用clock_gettime系统调用,而4.7不是这种情况,因此它始终使用高精度时钟no关于如何配置GCC,这可能解释了为什么你没有看到4.8.1的问题。

您应始终确保在运行时使用正确版本的libstdc++.so