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 命名空间中,仅保留以下几个独立命名空间:
|
模块
|
命名空间
|
|
命令行参数与配置解析
|
flag
|
|
日志组件
|
log
|
|
文件操作
|
fs
|
|
系统操作
|
os
|
|
JSON
|
json
|
|
Path 组件
|
path
|
|
时间相关功能中,仅 time::sleep 保留在 time 命名空间,用于与协程中的 co::sleep 区分;其余时间相关内容全部移入 co 命名空间,例如:
|
|
co::now.ms();
co::now.str();
co::mono_time.us();
::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. 迁移指南
|
旧接口
|
新接口
|
|
LOG << "..." << x;
|
log::info("...", x);
|
|
ELOG << "..." << x;
|
log::error("...", x);
|
|
time::unix.ms()
|
co::now.ms()
|
|
time::str()
|
co::now.str()
|
|
time::mono.us()
|
co::mono_time.us()
|
|
fastring / fastream
|
co::string
|
|
co::Json
|
json::any
|
|
协程 channel
|
已移除
|
|
hook
|
已移除
|
|
HTTP / SSL 组件
|
已移除(可从旧版本取用)
|
|
动态库
|
已移除(用户可自行封装)
|
6. 结语
本次改动较大,参考文档已落后于最新代码,使用过程中请以实际代码为准。
整体而言,v4.0.0 的代码结构更加简洁,更贴合 coost 一贯的极简风格,使用体验也更加流畅。
为了能够持续维护与改进 coost,作者提供一些付费服务,详见 readme 页面。