【问题标题】:c++ chrono duration_cast to milliseconds results in secondsc++ chrono duration_cast to milliseconds 结果以秒为单位
【发布时间】:2013-07-01 13:45:51
【问题描述】:

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

【问题讨论】:

  • 在这里工作正常:coliru.stacked-crooked.com/…
  • @R.MartinhoFernandes 你使用相同的 g++ 和 glibc 版本吗?
  • 我编辑了链接以包含 g++ -v 的输出(它是 4.8.1)。这意味着如果它是一个错误,它是固定的。
  • 代码在GCC 4.7.2下正常工作
  • @R.MartinhoFernandes 感谢您给了我使用 g++ 4.8 ;) 的想法。我会将 g++ 更改为默认指向版本 4.8 - 这应该可以解决我的问题。我还不知道在哪里,但也许我应该报告这个错误(现在看来相当肯定,这是由于 gcc v4.7.3)

标签: c++ c++11 chrono


【解决方案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 库中,因此结果取决于运行时使用的库,但 duration_cast 从该值到 milliseconds 的转换是由在编译时实例化的内联模板。如果编译时转换与运行时调用不一致,则结果不一致。

对于 GCC 4.8.1,system_clock 实现已改进为始终使用clock_gettime 系统调用(如果可用),而 4.7 则并非如此,因此无论 GCC 如何使用,它始终使用高精度时钟已配置,这可能解释了为什么您看不到 4.8.1 的问题。

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

【讨论】:

  • 太棒了。到目前为止,我从来没有关注过这个(说实话有点烦人)......我原以为这是一个新版本号的足够原因(显然不同版本的 libc 是不兼容的! ) 但好吧......谢谢你为我清理它
  • 在它们的默认配置中,库是兼容的,您的编译器之一必须使用--enable-libstdcxx-time 构建,这会改变库 ABI,在这种情况下,您的工作是避免混合不兼容的库。
猜你喜欢
  • 1970-01-01
  • 2015-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-23
相关资源
最近更新 更多