6

我想知道自纪元以来的毫秒数。一个流行的解决方案如下所示(这里提出的这个问题的解决方案之一是Get time since epoch in milliseconds,最好使用 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++like来编译它会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
4

1 回答 1

12

我认为发生的事情是您正在使用 GCC 4.7 进行编译,但运行时链接器正在使用libstdc++.so来自不同 GCC 版本的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 并非如此,因此无论 GCC 是如何配置的,它始终使用高精度时钟,这可能解释了为什么你不这样做看不到 4.8.1 的问题。

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

于 2013-07-01T15:34:53.500 回答