欢迎加入TBOOX开源工程微信公众号,我们会不定期推送一些TBOOX开发上的最新资讯以及技术文章给大家。
tbox的vector容器沿用了stl库中vector的命名,说白了就是以数组方式存储元素,也是整个容器库中最基础的容器之一。
当然,在c中用tbox的vector跟用stl的vector其实差不了太多,用起来都很方便。
先看个简单的例子熟悉下:
// 初始化一个维护大小写敏感字符串的vector容器,第一参数设置元素自动增长大小,这里使用0表示默认大小
tb_vector_ref_t vector = tb_vector_init(0, tb_element_str(tb_true));
if (vector)
{
// 在头部插入元素
tb_vector_insert_head(vector, "hi!");
// 在尾部插入元素
tb_vector_insert_tail(vector, "how");
tb_vector_insert_tail(vector, "are");
tb_vector_insert_tail(vector, "you");
// 遍历打印所有元素
tb_for_all (tb_char_t const*, cstr, vector)
{
// trace
tb_trace_d("%s", cstr);
}
// 销毁vector容器
tb_vector_exit(vector);
}
tbox的默认内存分配,是完全基于自己的内存池架构,支持内存的快速分配,和对碎片的优化,并且支持各种内存泄露、溢出检测。
如果不想用tbox内置的默认内存分配管理,也可以灵活切换到其他分配模式,因为tbox现在已经完全支持allocator架构, 只要在init阶段传入不同的分配器模型,就能快速切换分配模式,例如:
/* 采用默认的tbox内存管理,启用内存池维护、碎片优化、内存泄露溢出检测等所有特性
* 相当于使用了:tb_default_allocator(tb_null, 0)
*/
tb_init(tb_null, tb_null);
/* 采用默认的tbox内存管理,启用内存池维护、碎片优化、内存泄露溢出检测等所有特性
* 并且完全使用外部传入的一整块buffer上进行维护,不再使用其他native内存
*/
tb_init(tb_null, tb_default_allocator((tb_byte_t*)malloc(300 * 1024 * 1024), 300 * 1024 * 1024));
/* 采用一整块静态buffer上进行维护,启用内存泄露溢出检测等所有特性
* 这个跟tb_default_allocator的区别就是,这个allocator比较轻量,内部的数据结构简单,占用内存少,适合低资源环境
* 但是这个allocator不支持碎片优化,容易产生碎片
*/
tb_init(tb_null, tb_static_allocator((tb_byte_t*)malloc(300 * 1024 * 1024), 300 * 1024 * 1024));
// 完全使用系统native内存分配,内部不做任何处理和数据维护,所有特性依赖系统环境,tbox不再支持内存池和内存检测等特性
tb_init(tb_null, tb_native_allocator());
最近稍微整理了下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都没怎么去用。。
现在也只有bloomfilter算法模块,会用到其他多个hash的情况。
如果你想在同一个target上既编译静态库,又能编译动态库,那么稍微修改下 xmale.lua就行了:
add_target("test")
-- 设置编译target的类型,之前是:static/shared,现在改成动态的
set_kind("$(kind)")
-- 添加文件
add_files(*.c)
好了,现在默认编译的时候,会生成静态库:libtest.a
如果你想生成动态库,只需要执行:
# 简写
xmake f -k shared
# 或者
xmake config --kind=shared
# 编译
xmake