tbox的默认内存分配,是完全基于自己的内存池架构,支持内存的快速分配,和对碎片的优化,并且支持各种内存泄露、溢出检测。
如果不想用tbox内置的默认内存分配管理,也可以灵活切换到其他分配模式,因为tbox现在已经完全支持allocator架构,
只要在init阶段传入不同的分配器模型,就能快速切换分配模式,例如:
```c
/* 采用默认的tbox内存管理,启用内存池维护、碎片优化、内存泄露溢出检测等所有特性
* 相当于使用了:tb_default_allocator(tb_null, 0)
*/
tb_init(tb_null, tb_null);
/* 采用默认的tbox内存管理,启用
继续阅读 »
最近稍微整理了下tbox的utils模块,发现里面有很多都是一些,之前放置的hash算法,例如:md5, sha1, crc32, adler32啊什么,比较凌乱。
因此我抽时间整理下这些hash算法,打算单独建立个hash算法模块,来放置各种大大小小的hash算法。
顺便把tbox里面用到的一些字符串hash算法,也做了些整理,一并归并到这个新模块中,例如比较常用的一些字符串哈希:
bkdr, fnv, fnv-1a, aphash, rshash, djb2, murmur, sdbm, blizzard ...
其中 bkdr 的效果比较好,因此目前作为tbox里面主要的string哈希来用,其他的hash虽然实现
继续阅读 »
为了进一步裁剪tbox,更好的适配嵌入式开发平台,tbox新增了--micro=y的微模块编译选项
如果启用此编译选项,那么只会编译tbox里面较轻量的一些模块,是的编译后的库大小,尽量保证在64K左右。
先来讲讲一些跟库大小相关的编译选项:
* `--smallest=y`: 通用平台,最小编译模式,会禁用所有第三方依赖库,禁用所有扩展模块,启用最小化编译优化(库内部也会尽可能节省内存使用)
* `--micro=y`: 专门针对嵌入式平台设计,仅编译最为轻量的一些模块,启用最小化编译优化(有可能会包含一些可选组件)
smallest和micro的区别在于,即使启用了smallest禁用所有扩展模块,但是还是会内置比m
继续阅读 »
tbox之前提供的stackfull协程库,虽然切换效率已经非常高了,但是由于每个协程都需要维护一个独立的堆栈,
内存空间利用率不是很高,在并发量非常大的时候,内存使用量会相当大。
之前考虑过采用stacksegment方式进行内存优化,实现动态增涨,但是这样对性能还是有一定的影响,暂时不去考虑了。
最近参考了下boost和protothreads的stackless协程实现,这种方式虽然易用性和灵活性上受到了很多限制,但是对切换效率和内存利用率的提升效果还是非常明显的。。
因此,我在tbox里面也加上了对stackless协程的支持,在切换原语上参考了protothreads的实现,接口封装上参考了boost的设计,使得更加
继续阅读 »
tbox add a coroutine library with stackfull mode and provide the following features.
1. yield
2. suspend and resume
3. sleep
4. io scheduler with (epoll, poll, kqueue, select, poll ..)
5. supports stream, http and other all io modules of tbox
6. channel
7. lock
8. semaphore
继续阅读 »
stream是tbox的最常用的流,一般用于单路io操作,既可以进行阻塞读写,也可以非阻塞的读写。
目前可以支持 数据、文件、套接字、http协议以及各种过滤器的读写操作,也可以很方便的自定义扩展自己的流模块。
之前已经在tbox数据位操作接口的使用一文中,简单介绍了下stream的位读写接口,这里继续详细介绍下stream的常用数据读写接口。
流的常用初始化操作
下面直接上代码吧,基本上看下注释就知道怎么使用了,嘿嘿。。。
继续阅读 »
tbox的vector容器沿用了stl库中vector的命名,说白了就是以数组方式存储元素,也是整个容器库中最基础的容器之一。
当然,在c中用tbox的vector跟用stl的vector其实差不了太多,用起来都很方便。
先看个简单的例子熟悉下:
```c
// 初始化一个维护大小写敏感字符串的vector容器,第一参数设置元素自动增长大小,这里使用0表示默认大小
tb_vector_ref_t vector = tb_vector_init(0, tb_element_str(tb_true));
if (vector)
{
// 在头部插入元素
tb_vect
继续阅读 »
TBOX中提供了各种列表操作:
list: 元素在内部维护的双向链表
list_entry: 元素在外部维护的双向链表
single_list: 元素在内部维护的单向链表
single_list_entry: 元素在外部维护的单向链表
由于双链和单链的接口使用类似,这里主要就讲解双链的具体使用。
那什么是内部维护和外部维护呢? 简单地说:
外部维护:就是链表容器本身不存储元素,不开辟内存空间,仅仅是一个节点头,这样比较节省内存,更加灵活。(尤其是在多个链表间元素迁移的时候,或者多个链表需要统一内存池维护的时候)。
内部维护:就是链表容器本身回去开辟一块空间,去单独存储元素内
继续阅读 »
tbox对于数据文件的解析提供了完善的支持,可以对各种二进制数据,文件数据流,网络数据流等进行各种解析操作
并且提供了一整套字节解析、比特位解析的接口,来支持各种流模式:
stream
通用数据流,提供对流式数据的读写和解析,支持多层流嵌套以及各种协议(http, socket, file, data ...)
对于如何使用stream,这里暂时不详细介绍了,之后会单独重点介绍下,这里主要是为了描述,如何使用stream来处理字节数据的解析
例如,我要从数据流中,读取一个大端的16bits数值,很简单,只要:
c
tb_uint16_t value;
if (tb_stream_bread_u16_be(stream,
继续阅读 »
每个开发者在写了一段时间代码后,都会有自己一套适合自己的代码规范。
最近,也看到很多人聊起这些风格上的事,什么命名规则那个好啊,什么的。。
这些我个人不做评价,每个人观点和审美观都不一样,永远都争不出一个结果来,其实只要代码看着简洁明了,整个项目的规范统一就行了。。
这里,我只说说我在写tbox时候,对于一些代码规范上的一些个人经验,以及其演进过程。。
继续阅读 »