我想拥有自纪元以来的毫秒数。一个流行的解决方案如下所示(此问题的解决方案之一是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
答案 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
。