【问题标题】:How do I instantiate a boost::date_time::time_duration with nanoseconds?如何用纳秒实例化 boost::date_time::time_duration?
【发布时间】:2018-07-19 09:21:23
【问题描述】:

我觉得我在这里遗漏了一些明显的东西。我可以通过执行以下操作轻松地以毫秒、微秒或秒为单位制作 time_duration:

time_duration t1 = seconds(1);
time_duration t2 = milliseconds(1000);
time_duration t3 = microseconds(1000000);

但是没有纳秒的功能。将纯整数纳秒值转换为 time_duration 的技巧是什么?

我在 Debian Linux 上使用 amd64 架构。提升版本 1.55。

【问题讨论】:

    标签: boost boost-date-time


    【解决方案1】:

    boost::posix_time::microseconds 实际上是subsecond_duration<boost::posix_time::time_duration, 1000000>。所以……

    #include <boost/date_time/posix_time/posix_time.hpp>
    
    using nanoseconds = boost::date_time::subsecond_duration<boost::posix_time::time_duration, 1000000000>;
    int main() {
        boost::posix_time::time_duration t = nanoseconds(1000000000);
    
        std::cout << t << "\n";
    }
    

    打印

    00:00:01
    

    更新

    确实,在 Boost DateTime 库的 Compile Options 中,您可以看到有一个选择纳秒分辨率的选项:

    默认情况下,posix_time 系统使用单个 64 位整数 内部提供微秒级分辨率。作为一个 另一种选择,一个 64 位整数和一个 32 位整数的组合 (96位分辨率)可提供纳秒级 决议。默认实现可能会提供更好的性能 和更紧凑的内存使用,许多应用程序不 需要纳秒级的分辨率。

    要使用备用分辨率(96 位纳秒),变量 BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG 必须在库中定义 用户项目文件(即 Makefile、Jamfile 等)。这个宏不是 由公历系统使用,因此在构建时没有效果 图书馆。

    确实,您可以使用以下方法进行检查:

    Live On Coliru

    #define BOOST_DATE_TIME_POSIX_TIME_STD_CONFIG
    #include <boost/date_time/posix_time/posix_time.hpp>
    
    int main() {
        using namespace boost::posix_time;
        std::cout << nanoseconds(1000000000) << "\n";
    }
    

    【讨论】:

    • 库是否有某种原因没有这样定义它?
    • @mpr 我想默认库配置使用微秒分辨率boost.org/doc/libs/1_66_0/doc/html/date_time/posix_time.html
    • 使用记录在案的开关更新了答案以使用纳秒级分辨率(注意 ABI 兼容性和 ODR 问题。在构建整个库和相关翻译单元时,始终使用记录的标志!)跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多