Boost C++ 库

……世界上最受推崇和设计精良的 C++ 库项目之一。 Herb SutterAndrei AlexandrescuC++ 编码规范

PrevUpHomeNext

附录

附录:历史
附录:基本原理
附录:实现说明
附录:常见问题
附录:致谢
附录:未来计划

修复

  • 移除 Stopwatches,该功能从未正式发布。

修复

  • #11630 boost chrono 文档关于 boost chrono 版本和 IO API 的描述错误。
  • #12176 Chrono 不链接 Boost.System。
  • #12260 Bug: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 中缺少 std::限定符的 puts 调用。
  • #10851 time_point_output.cpp 中缺少 std::限定符的 puts 调用。
  • #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 由于未定义 pthread_getcpuclockid,Boost Chrono 在 HP uX 上编译失败。
  • #8006 Boost::Chrono 启动时断言 - steady_clock::now() - Windows。
  • #9337 chrono::process_cpu_clock 时间点在 Linux 上错误地乘以了 1000 倍。
  • #9342 V2 上 process_cpu_clock::timepoint io 的回归。
  • #9419 boost::chrono::floor()/round() 和负持续时间错误。
  • #9698 OSX 上未声明 boost::chrono::thread_clock。
  • #9720 boost::this_thread::sleep_for() 有时在 win32 上立即返回。
  • #9859 删除对 gcc-mingw 的引用。
  • #9918 Solaris 上的 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()'
  • #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 由于没有 CLOCK_REALTIME 宏,因此无法在 HP-UX 上编译 Chrono。
  • #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:duration_punct<> facet 已弃用。您应该使用 get_duration_style 自由函数获取信息,并使用 duration_units facet 用于本地化目的。

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

修复

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

新功能

  • 增强 chrono I/O
    • #5980 使用 H. Hinnant 的提案 提案 增强 chrono I/O,该提案的优势在于可以使用格里高利历提供系统时钟的 I/O。
    • #5981 添加持续时间和时间点格式化状态的 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:duration_punct<> facet 已弃用。您应该使用 get_duration_style 自由函数获取信息,并使用 duration_units facet 用于本地化目的。

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

修复

  • #7381 C++11 兼容性:将 constexpr duration 赋值给非 const 局部变量时,未解析符号。
  • #7479 如果标准库没有提供 constexpr 接口,则支持 constexpr 的编译器编译失败。
  • #7493 由于显式 bool 转换的错误,在 intel-linux-12.1.3.0x 上编译失败。
  • #7542 chrono/io 测试程序 Sandia-clang-trunk 缺少 -lpthread。

不会修复

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

尚未修复的已知错误

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

修复

  • #6918 由于未定义 pthread_getcpuclockid,Boost Chrono 在 HP uX 上编译失败。
  • #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]second 作为有效的持续时间输入失败。
  • #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 Process real cpu clock 返回系统稳定时钟(Windows)。
  • #5974 Process real cpu clock 应在 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 为 RHS。
  • #5323 为 chrono::time_point 添加关联类型 difference_type。

修复

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

特性

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

实现

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

修复

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

测试

  • 添加了对进程和线程时钟的测试。
  • 迁移到 lightweight_test.hpp。
  • 能够测试多种配置。

文档

  • 删除了一些无用的部分,如测试和工单。

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

为什么 duration 需要 operator%

此运算符便于计算给定持续时间在时间范围内的位置。一个激励性的例子是将持续时间转换为“分解”的时间持续时间,例如小时:分钟:秒

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

表 6.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 报告 Valgrind 问题并提出许多关于文档的建议。

后续版本计划
  • 添加一些持续时间的用户自定义字面量。
  • 包含 Howard Hinnant 定义的 chrono::date,详情此处

PrevUpHomeNext