以毫秒为单位的c++chrono duration_cast以秒为单位

c++ chrono duration_cast to milliseconds results in seconds

本文关键字:为单位 cast duration c++chrono      更新时间:2023-10-16

我想要自epoch以来的毫秒数。一个流行的解决方案如下所示(这里问的这个问题的解决方案之一获取自epoch以来的时间(以毫秒为单位),最好使用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++ -std=c++11 main.cpp -o timetest的对g++的调用编译它会导致输出

1372686001

这等于自epoch以来秒数

这是油嘴滑舌中的一个bug吗?在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