exa*_*ple 5 c++ c++11 c++-chrono
我想要有自纪元以来的毫秒数.一个流行的解决方案如下所示(此问题的解决方案之一在此处获取时间,以毫秒为单位,最好使用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;
}
Run Code Online (Sandbox Code Playgroud)
通过调用输出中的g++类似g++ -std=c++11 main.cpp -o timetest结果来编译它
1372686001
Run Code Online (Sandbox Code Playgroud)
这等于自纪元以来的秒数!
这是glibc中的一个错误吗?用g ++?我的错?
g++ (Debian 4.7.3-4) 4.7.3
ldd (Debian EGLIBC 2.17-6) 2.17
Run Code Online (Sandbox Code Playgroud)
更新:使用g ++ 4.8时可以使用它.所以这是一个gcc bug?!
g++-4.8 (Debian 4.8.1-2) 4.8.1
Run Code Online (Sandbox Code Playgroud)
Jon*_*ely 11
我认为正在发生的事情是您正在使用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
Run Code Online (Sandbox Code Playgroud)
之所以出现这种差异,system_clock::now()是因为调用是在libstdc++.so库中,因此结果取决于在运行时使用哪个库,但是duration_cast从该值的转换milliseconds是由在编译时实例化的内联模板完成的.如果编译时转换与运行时调用不一致,则结果不一致.
对于GCC 4.8.1,system_clock实现得到了改进,clock_gettime如果可用则始终使用系统调用,而不是4.7的情况,因此无论GCC如何配置,它都始终使用高精度时钟,这可能解释了为什么你不能看到4.8.1的问题.
您应该始终确保libstdc++.so在运行时使用正确的版本.