Boost C++ 库

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

附录 - Boost C++ 函数库
PrevUpHomeNext

修复

  • 移除了 Stopwatches,因为它从未被正式交付。

修复

  • #11630 boost chrono 文档关于 boost chrono 版本与 io API 的说明是错误的。
  • #12176 Chrono 无需链接 Boost.System
  • #12260 错误:time_fmt 在 Windows 上不支持 wchar_t

修复

  • #11330 boost::chrono::duration 的默认构造函数未初始化 rep_
  • #11618 Chrono IO V2 文档中的 ios_state.hpp 文件不存在
  • #11631 boost chrono io v2 不支持自定义时钟

修复

  • #10778 VC14 CTP4 Atomic 在与非 TriviallyCopyable 的 boost::chrono durations 编译时失败
  • #10840 test_7868.cpp 中 puts 调用缺少 std:: 限定符
  • #10851 time_point_output.cpp 中 puts 调用缺少 std:: 限定符
  • #10893 Boost.Chrono 文档中的一个小拼写错误
  • #10992 Chrono IO 状态保存器与 Boost.IO 状态保存器不一致
  • #10995 duration_put::put_value 截断了小数部分
  • #11006 由于多个错误,无法实例化 time_fmt_io_saver。
  • #11012 chrono_io v2 与 boost::chrono::duration< boost::rational<int> > 编译失败

修复

  • #6918 Boost Chrono 在 HP uX 上编译失败,因为 pthread_getcpuclockid 未定义
  • #8006 Boost::Chrono 在启动时断言 - steady_clock::now() - Windows
  • #9337 chrono::process_cpu_clock 的时间点在 Linux 上错误地乘以 1000
  • #9342 V2 中 process_cpu_clock::timepoint 的回归
  • #9419 boost::chrono::floor()/round() 和负时长不正确
  • #9698 boost::chrono::thread_clock 在 OSX 上未声明
  • #9720 boost::this_thread::sleep_for() 在 win32 上有时会立即返回
  • #9859 移除对 gcc-mingw 的引用
  • #9918 Solaris/gcc 上的 chrono 编译错误,函数 timegm
  • #9811 boost/boost/chrono/duration.hpp:355:56: error: call to non-constexpr function 'static std::numeric_limits<float>::_Ty std::numeric_limits<float>::max()' /home/zosun/input_service/inputservices-core-service/other/boost/boost/chrono/duration.hpp: In static member function 'static constexpr double boost::chrono::detail::chrono_numeric_limits<double, true>::lowest()'
  • #10069 32 位系统上 chrono 时钟溢出
  • #10151 timegm 函数在 QNX 上不可用

修复

  • #7868 chrono_io 解析时间不正确 (1.53 和 1.52)
  • #9028 boost/chrono/stopwatches/formatters/base_formatter.hpp 中的拼写错误
  • #9147 未初始化的 std::tm
  • #9274 system_clock 输入精度丢失。
  • #9276 system_clock::time_point 的输出比预期晚了一天。

修复

  • #8079 Chrono 内存泄漏
  • #8318 time_point 和 duration 的 BOOST_FORCEINLINE 构造函数
  • #8367 使用 clang (XCode 4.5.2) 和 -std=c++11 -stdlib=libc++ -arch armv7 编译 Chrono 失败
  • #8370 chrono 引用中的拼写错误
  • #8435 HP-UX 上编译 Chrono 失败,因为缺少 CLOCK_REALTIME 宏。
  • #8690 duration_units_default - 被覆盖方法中丢失了返回类型的 constness。
  • #8691 scan_keyword 调用后未检查 iostate。
  • #8696 Solaris/gcc 上的 chrono 编译错误。

已弃用

  • Boost.Chrono 1.2.x 中包含的 chrono I/O 版本在 2.0.0 版本中已被完全重构。
  • chrono I/O:操纵符 duration_shortduration_long 已被弃用。您应该使用参数化形式 duration_fmt 或重命名的操纵符 __duration_symbol 和 __duration_prefix。
  • chrono I/O:facet duration_punct<> 已被弃用。您应该使用自由函数 get_duration_style 来获取信息,并使用 duration_units facet 进行本地化。

当 BOOST_CHRONO_VERSION==2 时,前面已弃用的函数将不可用。

修复

  • #7546 time_point<system_clock> 的版本 2 输出编译失败,分配的 viboes Bugs Boost 1.53.0 --
  • #7547 time_point<system_clock> 的版本 2 输入编译失败,分配的 viboes Bugs Boost 1.53.0 --
  • #7868 chrono_io 解析时间不正确 (1.53 和 1.52)

新功能

  • 增强 chrono I/O
    • #5980 根据 H. Hinnant 的 提案 增强 chrono I/O,该提案的优点是为使用公历的系统时钟提供了 I/O。
    • #5981 为 duration 和 time_point 格式化状态添加 i/o 状态保存器。
    • #7059 添加底层 i/o 设施。

已弃用

  • Boost.Chrono 1.2.x 中包含的 chrono I/O 版本在 2.0.0 版本中已被完全重构。
  • chrono I/O:操纵符 duration_shortduration_long 已被弃用。您应该使用参数化形式 duration_fmt 或重命名的操纵符 __duration_symbol 和 __duration_prefix。
  • chrono I/O:facet duration_punct<> 已被弃用。您应该使用自由函数 get_duration_style 来获取信息,并使用 duration_units facet 进行本地化。

当 BOOST_CHRONO_VERSION==2 时,前面已弃用的函数将不可用。

修复

  • #7381 C++11 合规性:当将 constexpr duration 分配给非 const 局部变量时,出现未解析的符号。
  • #7479 如果标准库不提供 constexpr 接口,则支持 constexpr 的编译器将无法编译。
  • #7493 Intel-linux-12.1.3.0x 上的编译失败,因为显式 bool 转换存在 bug。
  • #7542 chrono/io 测试程序 Sandia-clang-trunk 中缺少 -lpthread。

不予修复

  • #6871 chrono_io.hpp:operator<<(ostream& os, ...) 修改了 os 的状态。
    • 版本 2 中提供的新 io 接口解决了这个问题。您应该迁移到新版本。

尚未修复的已知错误

  • #7525 Windows 上 clock_string<system_clock>::since() 错误

修复

  • #6918 Boost Chrono 在 HP uX 上编译失败,因为 pthread_getcpuclockid 未定义。
  • #6241 在没有 std::wstring 支持的情况下,boost::chrono 编译出现问题。
  • #6987 文档与 C++11。
  • #7041 time_point.hpp 依赖于 Boost.System。
  • #7042 避免 time_point 和 duration 依赖于 time.h 和 CLOCK_REALTIME。
  • #7058 在定义 BOOST_NO_EXCEPTIONS 时使其工作。
  • #7069 clock_string<thread_clock> 中的拼写错误。
  • #7081 boost/detail/win/basic_types.hpp 中的 WinError.h 拼写大小写。

修复

  • #6361 Windows 32 位系统下 boost::chrono::process_real_cpu_clock::now() 整数溢出。
  • #6628 process_cpu_clocks.hpp 中的编译器警告。
  • #6666 thread_clock.hpp 需要 pthread.h。

修复

  • #6092 从非整数时长进行输入会导致编译器失败。
  • #6093 [1/3]秒 作为有效时长输入会失败。
  • #6113 定义 BOOST_CHRONO_HEADER_ONLY 时出现重复符号。
  • #6243 Sandia-pgi-11.9: 匹配到多个重载函数 "min" 的实例。
  • #6257 Linux 上 process_cpu_clock::now() 返回的时间点是实际时间的 1/1000。

新功能

  • #5979 根据 Howard Hinnant 在 此处 定义的,添加了 chrono 舍入工具。
  • #5978 添加了 BOOST_CHRONO_HAS_PROCESS_CLOCKS 以了解进程时钟是否可用。
  • #5998 使混合错误处理成为可能(不提供)。
  • #5906 考虑标准中定义的 constexpr。
  • #5907 考虑支持 noexcept 的编译器。

修复

  • #2114 启用可见性支持 (Boost.Chorno 部分)
  • #5669 Intel 编译器编译 duration.hpp 失败
  • #5909 MAC 上的 process_cpu_clock::now() 返回的时间点是实际时间的 1/1000。
  • #5946 进程实时 CPU 时钟在 Windows 上返回系统稳定时钟。
  • #5974 进程实时 CPU 时钟在 MAC 上应使用 clock() 而不是 times(),前者速度更快一倍且分辨率更高。

清理

  • #5975 减少头文件、共享、静态链接的组合,以将测试时间减少 50%。
  • #5976 chrono_accuracy_test 不具确定性,应从回归测试中移除。
  • #5977 移除 Beman 版本中的旧文件。Beman 版本中包含的一些旧文件,在审查版本中未记录,已从存储库中彻底删除,例如:
    • boost/chrono/timer.hpp,
    • boost/chrono/process_times.hpp
    • boost/chrono/detail/process_clock.hpp,
    • boost/chrono/detail/mac/process_clock.hpp,
    • boost/chrono/detail/posix/process_clock.hpp,
    • boost/chrono/detail/win/process_clock.hpp,
    • boost/chrono/detail/run_timer.hpp,
    • boost/chrono/detail/run_timer_static.hpp,

新功能

  • #???? 添加了 time_point 的一元运算符 +,-,++,-- 以及与 Rep al RHS 的二元运算符 +,-
  • #5323 为 chrono::time_point 添加关联类型 difference_type。

修复

  • #5322 显式默认构造的 chrono::durations 未初始化
  • 将 chrono 移至 trunk,考虑了审查意见。
  • 文档修订。

功能

  • Boost_Chrono 现在是一个可配置的头文件库版本(允许用户选择是否包含 windows.h 文件)。
  • 添加了 clock_string<> trait。
  • 为所有时钟定义了 chrono-io。
  • 添加了 process_times 表示法的输入。

实现

  • 使用 detail/win 文件避免使用 windows.h 文件。
  • 完成了 error_code 处理。
  • 现在可以与 BOOST_SYSTEM_NO_DEPRECATED 一起使用。

修复

  • 修复了一些警告。
  • 修复了 Mac 上的原始错误
  • 不修复与 boost_system 的静态链接。

Test

  • 添加了 process 和 thread 时钟的测试。
  • 迁移到 lightweight_test.hpp。
  • 能够测试多种配置。

文档

  • 移除了某些无用的部分,例如测试和 tickets。

请参阅 N2661 - A Foundation to Sleep On,该文档信息丰富,并提供了关键设计决策的动机。本节包含该文档的一些摘录。

为什么 duration 需要 operator%

此运算符对于计算给定时长在时间段内的位置非常方便。一个激励性的例子是将时长转换为“分解”的时间时长,例如 hours::minutes::seconds。

class ClockTime
{
    typedef boost::chrono::hours hours;
    typedef boost::chrono::minutes minutes;
    typedef boost::chrono::seconds seconds;
public:
    hours hours_;
    minutes minutes_;
    seconds seconds_;

    template <class Rep, class Period>
      explicit ClockTime(const boost::chrono::duration<Rep, Period>& d)
        : hours_  (boost::chrono::duration_cast<hours>  (d)),
          minutes_(boost::chrono::duration_cast<minutes>(d % hours(1))),
          seconds_(boost::chrono::duration_cast<seconds>(d % minutes(1)))
          {}
};
在每个平台上实现每个时钟选择了哪些 API?

下表总结了每个平台上的每个时钟使用的 API。

表 5.4. 时钟 API 对应关系

时钟

Windows 平台

Posix 平台

Mac 平台

system_clock

GetSystemTimeAsFileTime

clock_gettime( CLOCK_REALTIME)

gettimeofday

steady_clock

QueryPerformanceCounter 和 QueryPerformanceFrequency

clock_gettime( CLOCK_STEADY)

mach_timebase_info,mach_absolute_time

process_real_cpu_clock

GetProcessTimes

times

times

process_system_cpu_clock

GetProcessTimes

times

times

process_user_cpu_clock

GetProcessTimes

times

times

process_cpu_clock

GetProcessTimes

times

times

thread_clock

GetThreadTimes

clock_gettime(pthread_getcpuclockid)

clock_gettime(pthread_getcpuclockid)


为什么 process_cpu_clock 有时给出的 CPU 秒数多于实际秒数?

请咨询您的操作系统供应商。结果已通过调试器检查,无论是 Windows 还是 Linux,这都是操作系统有时报告的结果。

时长算术中的整数溢出是否会被检测和报告?

Boost.Ratio 避免了所有可能因算术运算而导致的、可以简化的溢出。typedef durations 不会检测溢出。您需要一个能够处理溢出的时长表示。

哪些时钟应该用于基准测试?

每个时钟都有其自身的特点。这取决于您需要基准测试什么。大多数时候,您可能对使用线程时钟感兴趣,但如果您需要测量受同步影响的代码,进程时钟会更好。如果您有多个进程的应用程序,可能需要系统范围的时钟。

哪些时钟应该用于监视?

对于跟踪目的,最好使用系统范围的时钟。

该库的代码源自 Howard Hinnant 的 time2_demo 原型。非常感谢 Howard 将他的代码在 Boost 许可证下提供。原始代码由 Beman Dawes 修改,以符合 Boost 约定。

time2_demo 包含此注释

非常感谢 Andrei Alexandrescu、Walter Brown、Peter Dimov、Jeff Garland、Terry Golubiewski、Daniel Krugler、Anthony Williams。

文件 <boost/chrono_io.hpp> 已从 Howard Hinnant 的实验性头文件 <chrono_io> 适配而来。非常感谢 Howard。

Howard Hinnant,该库的真正作者,在库开发过程中提供了宝贵的反馈和建议。特别是,chrono_io_io.hpp 源代码已从 Howard Hinnant 的实验性头文件 <chrono_io> 适配而来。

Boost.Ratio 的验收评审于 2010 年 11 月 5 日至 15 日举行。非常感谢评审经理 Anthony Williams 和所有评审员:David Deakins、John Bytheway、Roland Bock 和 Paul A. Bristow。

感谢 Ronald Bock、Andrew Chinoff、Paul A. Bristow 和 John Bytheway 帮助完善文档。

感谢 Tom Tan 报告了 MSVC V10 beta 和 MinGW-gcc-4.4.0 的一些编译器问题,并为推动统一 process_cpu_clock 时钟付出了努力。

感谢 Ronald Bock 报告了 Valgind 问题,并对文档提出了许多建议。

未来版本
  • 为一些时长添加用户自定义字面量。
  • 包含 Howard Hinnant 定义的 chrono::date 此处

PrevUpHomeNext