gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:04:51 27 4
gpt4 key购买 nike

我想要自纪元以来的毫秒数。一个流行的解决方案如下所示(这里提出的这个问题的解决方案之一 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 错误?!

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

关于c++ chrono duration_cast 到毫秒结果以秒为单位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17405997/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com