内容简介:C++ 基础库 co 1.1 发布。CO 是一个优雅、高效的 C++ 基础库,支持 Linux, Windows 与 Mac 平台。 CO 追求极简、高效,不依赖于 boost 等三方库,仅使用了少量 C++11 特性。 github Changes 代码结构调整 头文件放...
C++ 基础库 co 1.1 发布。CO 是一个优雅、高效的 C++ 基础库,支持 Linux, Windows 与 Mac 平台。
CO 追求极简、高效,不依赖于 boost 等三方库,仅使用了少量 C++11 特性。
Changes
代码结构调整
- 头文件放到 include 目录.
- 源文件放到 src 目录.
rpcgen
更名为gen
.- 移除
unitest/base
目录,单元测试代码直接放到unitest
目录下. test
目录下支持子目录.
fast
fast.cc
中静态变量的定义放到函数中,初始化更安全.fast::dtoa
弃用基于LruMap
的实现,换用 Milo Yip 的实现(miloyip/dtoa-benchmark).- 新增
fast::stream
类,提供基本的流式输出操作.
fastream
- 继承于
fast::stream
类. - 支持 move 构造函数.
- 增加空状态.
fastream fs; // 定义一个空的 fastream 对象,不分配内存
- 支持 append 自己.
fastream fs; fs << "hello " << 23; fs.append(fs); fs << fs; // <==> fs.append(fs)
fastring
- 与
fastream
一样,继承于fast::stream
类,因此也支持流式输出操作.fastring s; s << "hello " << 23;
- fastring 与 fastream 的内存结构相同,二者可以无缝转换.
fastring s; fastream& fs = *(fastream*)&s
- 移除引用计数,使 fastring 的复制行为与
std::string
类似,使用起来不容易出错.fastring s("hello"); fastring t(s); // 通过内存拷贝创建一个新的字符串
append
操作增加inside
检查,修复内存重叠时的逻辑漏洞.fastring s("123"); s.append(s.c_str() + 1); // s -> "12323"
- 删除
clone()
方法,移除引用计数后,此方法多余.
str
str::dbg()
支持std::unordered_map
与std::unordered_set
.
flag
- 优化命令行参数与配置文件的解析顺序,先解析配置文件,再解析其他命令行参数.
# 先解析配置文件 xx.conf,再解析其他命令行参数 # 命令行中 x, s 的值会覆盖 xx.conf 中的值,方便调试 ./xx -x -s="hello" -config=xx.conf
- Linux 平台增加内置 bool flag
daemon
,以支持后台运行程序# 可在命令行参数中带上 -daemon # 也可在配置文件中设置: daemon = true ./xx -daemon
- 命令行参数支持多种格式,
-x=y
可以写成-x y
或者x=y
./xx -i=8 u=88 -s="hello world" ./xx -i 8 -u 88 -s "hello world"
- 优化程序启动时指定配置文件的方式.
./xx config=xx.conf # 用 flag config 显示指定 ./xx xx.conf # 配置文件名以 .conf 或 config 结尾,且是程序命令行的第一个非 flag 参数,则可省略 config= ./xx -x xx.conf # -x 是 flag,xx.conf 是第一个非 flag 参数
- 定义 flag 时,可以在注释中指定级别,以控制 flag 在配置文件中的顺序.
// 在注释开头用 #3 指定级别为 3 // 支持的级别为 0-99,默认为 10 // 使用 --mkconf 自动生成配置文件时,flag 按级别、文件名、代码行数排序 DEF_bool(b, false, "#3 xxx");
log
- signal handler 中部分函数修改为
async-signal-safe
版本的函数,更安全.
协程库
- 修复未及时移除 epoll(kevent, iocp) 中注册的 io 事件引起的 bug.
- 修复 Scheduler 在 add_timer() 时,内部 iterator 未正确更新的 bug.
- 改进
co::connect
,co::accept
等的实现,以支持 ipv6. - 新增
co::max_sched_num()
接口,获取支持的最大调度线程数,目前为系统 cpu 核数. - 新增
co::sched_id()
接口,获取当前的调度线程 id. - 新增
coroutine_id()
接口,获取当前协程的 id. - 重构 Scheduler,内部逻辑结构更清晰,同时提高代码的可读性.
- 修改
co::tcp_socket()
,co::udp_socket()
接口的参数为 address family,弃用早期用 4 与 6 指定 ipv4 与 ipv6 的方式.sock_t tcp_socket(int af=AF_INET); // @af: address family, AF_INET, AF_INET6, etc. sock_t udp_socket(int af=AF_INET); // @af: address family, AF_INET, AF_INET6, etc.
- 新增
co::socket()
接口,与原生 api 保持一致. - 修复 hook 实现中一些静态全局变量的初始化问题.
- 优化
co::Event
的内部实现. - 重构
co::Pool
:- 用户可以指定 callback
ccb
与dcb
,分别用于创建、销毁元素. - 用户可以指定 pool 的最大容量(仅在 dcb 设置时有效).
- 内部实现中向 Scheduler 注册 cleanup callback,保证在调度线程结束时进行 co::Pool 的清理工作.
- 用户可以指定 callback
co::Kakalot
重命名为co::PoolGuard
.
json
- 内部引用计数,使用原子操作,复制 Json 对象更安全.
- 重构 Json 内部的内存模型,修复之前因内部内存变化引起的 bug.
- 内部增加简单的内存分配器
Jalloc
,提升 Json 的性能. json::parse()
支持数组对象的解析.Json v = json::parse("[1, 2, 3]");
- 新增
Json::dbg()
接口,将 Json 对象转换为 debug string (Json 对象中较长的字符串可能被截断). - log 库调用
Json::dbg()
输出 Json 对象,使得输出的日志更精简.
rpc
- 简化,移除一些不必要的配置项.
- 优化连接管理,可以通过
rpc_conn_idle_sec
与rpc_max_idle_conn
指定空闲连接的超时时间、最大的空闲连接数.
hash
- 修改
hash32()
的实现,32 位系统使用 murmur 2 的 32 位版本,64 位系统直接取hash64
的低 32 位.
编译
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- JetLinks 物联网基础平台 1.2 发布
- C++ 基础库 CO 1.2 发布
- 中国发布自己的域名系统基础软件 “红枫”
- 中国发布自主开发的域名系统基础软件 “红枫”
- Terraform 0.9.8 发布,基础架构管理工具
- JetLinks 物联网基础平台 1.0 RELEASE 发布
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Pro CSS and HTML Design Patterns
Michael Bowers / Apress / April 23, 2007 / $44.99
Design patterns have been used with great success in software programming. They improve productivity, creativity, and efficiency in web design and development, and they reduce code bloat and complexit......一起来看看 《Pro CSS and HTML Design Patterns》 这本书的介绍吧!