Boost C++ 库

...世界上最受推崇和设计最精良的 C++ 库项目之一。 Herb SutterAndrei Alexandrescu, 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 由于未定义的 pthread_getcpuclockid,HP uX 上的 Boost Chrono 编译失败
  • #8006 Boost::Chrono 启动时断言 - steady_clock::now() - Windows
  • #9337 Linux 上 chrono::process_cpu_clock 时间点错误 1000 倍
  • #9342 V2 上 process_cpu_clock::timepoint io 的回归
  • #9419 boost::chrono::floor()/round() 和负 duration 是错误的
  • #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: 错误:调用非 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 chrono 无法使用来自 XCode 4.5.2 的 clang 以及 -std=c++11 -stdlib=libc++ 和 -arch armv7 编译
  • #8370 chrono 参考中的错别字
  • #8435 由于没有 CLOCK_REALTIME 宏,无法在 HP-UX 上编译 Chrono。
  • #8690 duration_units_default - 重写方法中丢失返回类型常量性。
  • #8691 在 scan_keyword 调用后未检查 iostate。
  • #8696 Solaris/gcc 上的 chrono 编译错误。

已弃用

  • Boost.Chrono 1.2.x 中包含的 chrono i/o 版本已在 2.0.0 版本中完全重构
  • chrono I/O:操作符 duration_short, duration_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 无法编译 assigned viboes Bugs Boost 1.53.0 --
  • #7547 time_point<system_clock> 输入版本 2 无法编译 assigned 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_short, duration_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 tester Sandia-clang-trunk 中缺少 -lpthread

不修复

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

尚未修复的已知错误

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

修复

  • #6918 由于未定义的 pthread_getcpuclockid,HP uX 上的 Boost Chrono 编译失败。
  • #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]second 作为有效的 duration 输入失败。
  • #6113 当定义了 BOOST_CHRONO_HEADER_ONLY 时,重复符号。
  • #6243 Sandia-pgi-11.9:多个重载函数 "min" 匹配。
  • #6257 linux 上 process_cpu_clock::now() 给出的 time_point 是 1/1000 倍。

新特性

  • #5979 添加了 Howard Hinnant 定义的 chrono 舍入实用程序 这里
  • #5978 添加了 BOOST_CHRONO_HAS_PROCESS_CLOCKS 以了解 process 时钟是否可用。
  • #5998 使不提供混合错误处理成为可能。
  • #5906 考虑标准中定义的 constexpr。
  • #5907 为支持它的编译器考虑 noexcept。

修复

  • #2114 启用可见性支持 (Boost.Chorno 部分)
  • #5669 Intel 编译器无法编译 duration.hpp
  • #5909 MAC 上 process_cpu_clock::now() 给出的 time_point 是 1/1000 倍。
  • #5946 Process real cpu clock 返回系统稳定时钟 (windows)。
  • #5974 Process real cpu clock 应该在 MAC 中使用 clock() 而不是 times(),clock() 快两倍且分辨率更高。

清理

  • #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。
  • 添加 process_times 表示的输入。

实现

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

修复

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

测试

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

文档

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

请参阅 N2661 - 睡眠的基础,该文档内容丰富,并为关键设计决策提供了动机。本节包含该文档的一些摘录。

为什么 duration 需要 operator%

此运算符方便计算给定 duration 在时间框架中的位置。一个有力的例子是将 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 避免了所有可能由算术运算产生并且可以简化的溢出。 typedefs durations 不检测溢出。您将需要一个处理溢出的 duration 表示。

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

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

应该使用哪些时钟进行监视?

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

该库的代码源自 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 问题,并感谢他提出的许多关于文档的建议。

对于以后的版本
  • 为某些 durations 添加用户定义的字面量。
  • 包含 Howard Hinnant 定义的 chrono::date 这里

PrevUpHomeNext