Boost C++ 库

……世界上最受推崇、设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, C++ 编码标准

附录 - 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 duration
  • #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 Linux 上 chrono::process_cpu_clock 的 time points 差 1000 倍
  • #9342 V2 上 process_cpu_clock::timepoint IO 的回归
  • #9419 boost::chrono::floor()/round() 和负 duration 的计算错误
  • #9698 boost::chrono::thread_clock 在 OSX 上未声明
  • #9720 boost::this_thread::sleep_for() 在 win32 上有时会立即返回
  • #9859 移除对 gcc-mingw 的引用
  • #9918 Solaris 上 chrono 编译错误,函数 timegm
  • #9811 boost/boost/chrono/duration.hpp:355:56: 错误:调用非 constexpr 函数 'static std::numeric_limits<float>::_Ty std::numeric_limits<float>::max()' /home/zosun/input_service/inputservices-core-service/other/boost/boost/chrono/duration.hpp: 在静态成员函数 'static constexpr double boost::chrono::detail::chrono_numeric_limits<double, true>::lowest()' 中
  • #10069 32 位系统上 chrono 时钟溢出
  • #10151 QNX 上 timegm 函数不可用

修复

  • #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 IO 版本在 2.0.0 版本中已被完全重构。
  • Chrono IO:操纵符 duration_shortduration_long 已弃用。您应该使用参数化形式 duration_fmt 或重命名为 __duration_symbol 和 __duration_prefix 的操纵符。
  • Chrono IO:duration_punct<> 面已弃用。您应该使用 get_duration_style 自由函数来获取信息,并使用 duration_units 面进行本地化。

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

修复

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

新功能

  • 增强 chrono IO
    • #5980 通过 H. Hinnant 的提案 提案 增强 chrono IO,该提案的优点是提供系统时钟的 IO,使用公历。
    • #5981 添加 duration 和 time_point 格式化状态的 IO 状态保存器。
    • #7059 添加低级 IO 功能。

已弃用

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

当 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 来自非整数 duration 的输入会导致编译器失败。
  • #6093 [1/3] 秒作为有效 duration 输入时失败。
  • #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 Windows 上的 process_real_cpu_clock 返回 system steady clock。
  • #5974 MAC 上的 process_real_cpu_clock 应使用 clock() 而不是 times(),前者速度快一倍且分辨率更高。

清理

  • #5975 将 header-only、shared、static 链接的组合减少一半,以降低测试时间 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 在 RHS 上的二元运算符 +,-
  • #5323 为 chrono::time_point 添加了关联类型 difference_type。

修复

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

功能

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

实现

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

修复

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

Test

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

文档

  • 移除了一些无用部分,如测试和 ticket。

参见 N2661 - A Foundation to Sleep On,该文档非常翔实,并为关键设计决策提供了动机。本节包含该文档的一些摘录。

为什么 duration 需要 operator%

此运算符方便计算一个给定的 duration 在一个时间帧中的位置。一个示例是将其转换为“分解”的时间 duration,例如 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,这似乎是操作系统有时报告的结果。

duration 算术中的整数溢出是否被检测到并报告?

Boost.Ratio 避免了由于算术运算可能导致的各种溢出,并且可以进行简化。typedef duration 不会检测溢出。您将需要一个处理溢出的 duration 表示。

进行基准测试应使用哪些时钟?

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

用于监视应使用哪些时钟?

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

库代码源自 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 报告了 Valgrind 问题,并提出了许多关于文档的建议。

后续版本
  • 为某些 duration 添加用户自定义字面量。
  • 包含 Howard Hinnant 在 此处 定义的 chrono::date。

PrevUpHomeNext