|
|
coost v4.0.0 是一次较大的版本更新:编译器要求提升至 C++17,移除了若干维护成本较高的模块,新增 Windows ARM64 与 FreeBSD 平台支持,并对核心组件进行了性能优化与 API 整理。升级前请先阅读下方的破坏性变更。
1. 破坏性变更
编译器要求 C++17
•
旧版本中的流式日志写法:
•
在本版本中被替换为更安全、更直观的函数式写法:
- 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();
复制代码
•
若要调用 C 标准库中的同名函数,请显式加全局作用域:
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 页面。
原文链接 |
|