coost v4.0.0 是一次较大的版本更新:编译器要求提升至 C++17,移除了若干维护成本较高的模块,新增 Windows ARM64 与 FreeBSD 平台支持,并对核心组件进行了性能优化与 API 整理。升级前请先阅读下方的破坏性变更。
1. 破坏性变更
编译器要求 C++17
-
旧版本中的流式日志写法:
LOG << "hello " << 23;
-
在本版本中被替换为更安全、更直观的函数式写法:
log::info("hello ", 23);
log::warn("hello ", 23);
该写法依赖 C++17,目前主流编译器对 C++17 的支持已经成熟,因此本版本将最低标准提升到 C++17。
不再支持动态库
动态库的维护成本较高,需要在每个导出符号上加 __coapi,容易遗漏。本版本不再提供动态库支持,有需要的用户可以自行将 coost 封装成动态库。
移除 hook 功能
协程 hook 依赖的 fishhook、detours 在 GitHub 上已多年未更新,且 hook 面临的环境复杂,难以在各平台提供统一且稳定的实现。为降低维护负担,本版本移除了 hook 功能。如有定制化的 hook 需求,作者提供针对特定平台的付费服务。
移除 HTTP、SSL 等网络组件
这些组件依赖 libcurl、openssl 等第三方库,维护成本较高,本版本予以移除。有需要的用户可以从旧版本中获取相关代码自行维护。
移除 fastring、fastream
旧版本中的 fastring、fastream 已合并为 co::string,字符串相关的功能统一收敛到 co/string.h。
移除协程 channel
channel 性能较差、代码维护困难,实际使用场景有限,本版本予以移除。
命名空间调整
本版本将大部分功能统一收敛到 co 命名空间中,仅保留以下几个独立命名空间:
|
模块 |
命名空间 |
|---|---|
|
命令行参数与配置解析 |
|
|
日志组件 |
|
|
文件操作 |
|
|
系统操作 |
|
|
JSON |
|
|
Path 组件 |
|
|
时间相关功能中,仅 |
co::now.ms();
co::now.str();
co::mono_time.us();
-
若要调用 C 标准库中的同名函数,请显式加全局作用域:
::log(...);
::time(0);
2. 新增平台支持
本版本新增对 Windows ARM64 与 FreeBSD 的支持。构建与测试均已在 CI 中覆盖。
由于 FreeBSD 平台上 unix 是一个宏,原 co/time.h 中的以下接口:
time::unix.ms();
time::str();
time::mono.us();
-
调整为:
co::now.ms();
co::now.str();
co::mono_time.us();
3. 新增与优化
终端输出
终端输出功能迁移到 co/print.h,提供 co::print、co::println 两个函数,并支持颜色:
co::color c;
co::print(c.red("red\n"));
co::println("hello ", c.red, "coost ", c.green, 123, c.deflt);
性能与易用性改进
-
benchmark:增加预热机制,新增sub_group功能; -
闭包(
co/closure.h):抛弃原先基于继承与虚函数的实现,改为非模板、无虚函数的设计,性能更好,使用更方便; -
内置
flag:注释支持中英双语,并根据系统语言环境自动选择; -
日志组件:原先的
LOG、ELOG等宏替换为log::info()、log::error()等函数,更安全,也更便于调试; -
co/rand.h:优化co::randstr()的性能与安全性; -
同步事件:优化跨线程的
co::sync_event,以及协程与线程混合环境下的co::event;移除signal方法,新增notify_one、notify_all; -
协程同步原语:优化
co::mutex、co::wait_group。
4. Bug 修复
-
修复 32 位 Windows 下程序崩溃时无法打印堆栈信息的问题;
-
修复 macOS 下程序崩溃时无法打印堆栈信息的问题(依赖 libbacktrace,需要用户自行安装);
-
修复 32 位 ARM 系统下,因协程 sp 未按 8 字节对齐导致的 bus error。
5. 迁移指南
|
旧接口 |
新接口 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
协程 |
已移除 |
|
hook |
已移除 |
|
HTTP / SSL 组件 |
已移除(可从旧版本取用) |
|
动态库 |
已移除(用户可自行封装) |
6. 结语
本次改动较大,参考文档已落后于最新代码,使用过程中请以实际代码为准。
整体而言,v4.0.0 的代码结构更加简洁,更贴合 coost 一贯的极简风格,使用体验也更加流畅。
为了能够持续维护与改进 coost,作者提供一些付费服务,详见 readme 页面。