C++中无法将chrono::duration加到chrono::time_point上

3

我有这段测试代码:

#include <time.h>
#include <stdio.h>
#include <chrono>

namespace chrono = std::chrono;

int main()
{
    struct timespec ts;
    clock_gettime(CLOCK_REALTIME, &ts);

    printf("time %ld.%09ld\n", ts.tv_sec, ts.tv_nsec);

    chrono::time_point<chrono::high_resolution_clock> t(chrono::seconds(ts.tv_sec));
    t += chrono::nanoseconds(ts.tv_nsec);

    chrono::seconds secs = chrono::duration_cast<chrono::seconds>(t.time_since_epoch());
    chrono::nanoseconds nsecs = chrono::duration_cast<chrono::nanoseconds>(t.time_since_epoch() - secs);

    printf("time %ld.%09ld\n", secs.count(), nsecs.count());
}

在Ubuntu中,使用g++ 4.7.3编译没有问题。但在Debian 7上,使用4.7.2版本时出现了以下编译错误:

/home/atip/chronotest.cpp: In function ‘int main()’:
/home/atip/chronotest.cpp:15:40: error: no match for ‘operator+=’ in ‘t += std::chrono::duration<long int, std::ratio<1l, 1000000000l> >((*(const long int*)(& ts.timespec::tv_nsec)))’
/home/atip/chronotest.cpp:15:40: note: candidate is:
In file included from /home/atip/chronotest.cpp:3:0:
/usr/include/c++/4.7/chrono:550:2: note: std::chrono::time_point<_Clock, _Dur>& std::chrono::time_point<_Clock, _Dur>::operator+=(const duration&) [with _Clock = std::chrono::system_clock; _Dur = std::chrono::duration<long int, std::ratio<1l, 1000000l> >; std::chrono::time_point<_Clock, _Dur> = std::chrono::time_point<std::chrono::system_clock, std::chrono::duration<long int, std::ratio<1l, 1000000l> > >; std::chrono::time_point<_Clock, _Dur>::duration = std::chrono::duration<long int, std::ratio<1l, 1000000l> >]
/usr/include/c++/4.7/chrono:550:2: note:   no known conversion for argument 1 from ‘std::chrono::nanoseconds {aka std::chrono::duration<long int, std::ratio<1l, 1000000000l> >}’ to ‘const duration& {aka const std::chrono::duration<long int, std::ratio<1l, 1000000l> >&}’

不确定如何解读这个问题,我该如何在两者上使其工作?最终我有一个函数可以获取 timespec 并将其转换为 chrono::time_point,然后稍后再将其转换回来。

1个回答

3
假设两种实现都符合规范。
显然,在Ubuntu上,`high_resolution_clock`的分辨率是纳秒或更高,但在Debian 7上,`high_resolution_clock`的分辨率比纳秒粗糙。编译时错误可以防止您意外截断算术运算:
t += chrono::nanoseconds(ts.tv_nsec);

有时候,我们无法准确地表示纳秒

如果需要,你可以通过明确要求截断来解决这个问题:

t += chrono::duration_cast<chrono::high_resolution_clock::duration>(chrono::nanoseconds(ts.tv_nsec));

这将向零截断。 或者您可以选择其他舍入模式,但需要自行实现。 这里 是一个关于chrono::duration的舍入到偶数算法的示例(搜索“round”)。

嗯,我需要重新编译libstdc++6软件包才能启用纳秒分辨率时钟吗? - Aaron
我不知道。可能是因为该平台不支持纳秒级分辨率。std::lib实现应该尽可能支持最高分辨率,并且实现者有动力这样做。但通常需要操作系统的支持才能实现,而可能缺少这种支持。 - Howard Hinnant
然иҖҢпјҢжӮЁеҸҜд»ҘеңЁ<chrono>еә“дёӯзј–еҶҷиҮӘе·ұзҡ„ж—¶й’ҹгҖӮиҝҷжҳҜжҲ‘зј–еҶҷзҡ„дёҖдёӘдҪҝз”ЁIntelжҢҮд»Өrdtscе®һзҺ°ж—¶й’ҹзҡ„дҫӢеӯҗгҖӮhttps://dev59.com/questions/nHI_5IYBdhLWcg3wMf9_#5524138гҖӮиҷҪ然дёҚеҸҜ移жӨҚпјҢдҪҶе®ғдёҺж•ҙдёӘC++11 std::libдә’ж“ҚдҪңгҖӮ - Howard Hinnant
使用Visual Studio 12时,Windows 7的外观似乎与高分辨率持续时间默认值不同。 - Stéphane
很棒的东西,我不知道分辨率限制,编译器错误非常晦涩。这些行为有文档记录吗? - yano
1
@yano:C++的“官方文档”是C++标准,您可以在此处找到各种工作草案:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/。这是一本关于整个std::lib的优秀书籍,包括chrono:http://www.cppstdlib.com。这是一个关于chrono的免费视频教程:https://www.youtube.com/watch?v=P32hvk8b13M。 - Howard Hinnant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接