<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 設計應用 > 一個(gè)用C語(yǔ)言實(shí)現的跨平臺開(kāi)發(fā)庫

一個(gè)用C語(yǔ)言實(shí)現的跨平臺開(kāi)發(fā)庫

作者: 時(shí)間:2024-01-18 來(lái)源: 收藏

TBOX簡(jiǎn)介

本文引用地址:http://dyxdggzs.com/article/202401/454974.htm

TBOX是一個(gè)用c語(yǔ)言實(shí)現的。

針對各個(gè)平臺,封裝了統一的接口,簡(jiǎn)化了各類(lèi)開(kāi)發(fā)過(guò)程中常用操作,使你在開(kāi)發(fā)過(guò)程中,更加關(guān)注實(shí)際應用的開(kāi)發(fā),而不是把時(shí)間浪費在瑣碎的接口兼容性上面,并且充分利用了各個(gè)平臺獨有的一些特性進(jìn)行優(yōu)化。

這個(gè)項目的目的,是為了使C開(kāi)發(fā)更加的簡(jiǎn)單高效。

目前支持的平臺有: Windows, Macosx, Linux, Android, iOS, *BSD等等。

通過(guò)xmake支持各種模式:

· Release: 正式版,禁用調試信息、斷言,各種檢測機制,啟用器優(yōu)化

· Debug: 調試模式,默認啟用詳細調試信息、斷言、內存越界檢測、內存泄漏、鎖競爭分析等檢測機制

· Small: 最小化編譯,默認禁用所有擴展模塊,啟用編譯器最小化優(yōu)化

· Micro: 針對嵌入式平臺,僅僅編譯tbox微內核,僅提供最基礎的接口,生成庫僅64K左右(內置輕量libc接口實(shí)現)

特性

流庫

針對http、file、socket、data等流數據,實(shí)現統一接口進(jìn)行讀寫(xiě),并且支持: 阻塞、非阻塞、異步 三種讀寫(xiě)模式。支持中間增加多層filter流進(jìn)行流過(guò)濾,實(shí)現邊讀取,內部邊進(jìn)行解壓、編碼轉換、加密等操作,極大的減少了內存使用。

主要提供以下模塊:

stream:通用非阻塞流,用于一般的單獨io處理,同時(shí)支持協(xié)程以實(shí)現異步傳輸。

transfer:流傳輸器,維護兩路流的傳輸。

static_stream:針對靜態(tài)數據buffer優(yōu)化的靜態(tài)流,用于輕量快速的數據解析。

協(xié)程庫

快速高效的協(xié)程切換支持

· 提供支持,核心切換算法參考boost,并且對其進(jìn)行重寫(xiě)和優(yōu)化,目前支持架構:x86, x86_64, arm, arm64, mips32

· 提供channel協(xié)程間數據通信支持,基于生產(chǎn)、消費者模型

· 提供信號量、協(xié)程鎖支持

socket、stream都模塊原生支持協(xié)程,并且可在線(xiàn)程和協(xié)程間進(jìn)行無(wú)縫切換

· 提供http、file等基于協(xié)程的簡(jiǎn)單服務(wù)器實(shí)例,只需幾百行代碼,就可以從socket開(kāi)始寫(xiě)個(gè)高性能io服務(wù)器,代碼邏輯比異步回調模式更加清晰

· 同時(shí)提供stackfull, stackless兩種協(xié)程模式支持,stackless協(xié)程更加的輕量(每個(gè)協(xié)程只占用幾十個(gè)bytes),切換更快(會(huì )犧牲部分易用性)

支持epoll, kqueue, poll, select 和 IOCP

· 在協(xié)程和poller中支持同時(shí)等待和調度socket,pipe io和process

數據庫

· 統一并簡(jiǎn)化數據庫操作接口,適配各種數據源,通過(guò)統一的url來(lái)自動(dòng)連接打開(kāi)支持的數據庫,數據的枚舉采用迭代器模型。

· 目前支持sqlite3以及mysql兩種關(guān)系型數據庫,也可自定義擴展使用其他關(guān)系型數據庫。

xml庫

· 針對xml提供DOM和SAX兩種解析模式,SAX方式采用外部迭代模式,靈活性和性能更高,并且可以選擇指定路徑,進(jìn)行解析。

· 解析過(guò)程完全基于stream,所以是高度流化的,可以實(shí)現邊下載、邊解壓、邊轉碼、邊解析一條龍服務(wù),使用較低的內存也可以解析大規模數據。

· 提供xml writer以支持對xml生成。

內存庫

· 參考linux內核內存管理機制的實(shí)現,并對其進(jìn)行各種改造和優(yōu)化,所實(shí)現的TBOX獨有的一整套內存池管理架構。

· 調試模式下,可以輕松檢測并定位內存泄露、內存越界溢出、內存重疊覆蓋等常見(jiàn)內存問(wèn)題,并對整體內存的使用進(jìn)行了統計和簡(jiǎn)要分析。

· 針對大塊數據、小塊數據、字符串數據進(jìn)行了充分的利用,避免了大量外部碎片和內部碎片的產(chǎn)生。分配操作進(jìn)行了各種優(yōu)化,96%的情況下,效率都是在O(1)。

容器庫

· 提供哈希、鏈表、數組、隊列、堆棧、最小最大堆等常用容器。

· 支持各種常用成員類(lèi)型,在原有的容器期初上,其成員類(lèi)型還可以完全自定義擴展。

· 所有容器都支持迭代器操作。

· 大部分容器都可以支持基于stream的序列化和反序列化操作。

算法庫

· 提供各種排序算法:冒泡排序、堆排序、快速排序、插入排序。

· 提供各種查找算法:線(xiàn)性遍歷、二分法搜索。

· 提供各種遍歷、刪除、統計算法。

· 以迭代器為接口,實(shí)現算法和容器的分離,類(lèi)似stl,但是c實(shí)現的,更加輕量。

網(wǎng)絡(luò )庫

· 實(shí)現http客戶(hù)端模塊

· 實(shí)現cookies

· 實(shí)現dns解析與緩存

· 實(shí)現ssl(支持openssl, polarssl, mbedtls)

· 支持ipv4、ipv6

· 支持通過(guò)協(xié)程實(shí)現異步模式

數學(xué)運算庫

· 提供各種精度的定點(diǎn)運算支持

· 提供隨機數生成器

libc庫

· libc的一個(gè)輕量級實(shí)現,完全跨平臺,并且針對不同架構進(jìn)行了優(yōu)化。

· 支持大部分字符串、寬字符串操作。

擴展字符串、寬字符串的各種大小寫(xiě)不敏感操作接口

· 擴展memset_u16、memset_u32等接口,并對其進(jìn)行高度優(yōu)化,尤其適合圖形渲染程序

libm庫

· libm部分接口的一個(gè)輕量級實(shí)現,以及對常用系統接口的封裝。(目前只實(shí)現了部分,之后有時(shí)間會(huì )完全實(shí)現掉)

· 擴展部分常用接口,增加對sqrt、log2等常用函數的整數版本計算,進(jìn)行高度優(yōu)化,不涉及浮點(diǎn)運算,適合嵌入式環(huán)境使用。

object庫

· 輕量級類(lèi)apple的CoreFoundation庫,支持object、dictionary、array、string、number、date、data等常用對象,并且可以方便擴展自定義對象的序列化。

· 支持對xml、json、binary以及apple的plist(xplist/bplist)格式序列化和反序列化。并且實(shí)現自有的binary序列化格式, 針對明文進(jìn)行了簡(jiǎn)單的加密,在不影響性能的前提下,序列化后的大小比bplist節省30%。

平臺庫

· 提供file、directory、socket、thread、time等常用系統接口

· 提供atomic、atomic64接口

· 提供高精度、低精度定時(shí)器

· 提供高性能的線(xiàn)程池操作

· 提供event、mutex、semaphore、spinlock等事件、互斥、信號量、自旋鎖操作

· 提供獲取函數堆棧信息的接口,方便調試和錯誤定位

· 提供跨平臺動(dòng)態(tài)庫加載接口(如果系統支持的話(huà))

· 提供io輪詢(xún)器,針對epoll, poll, select, kqueue進(jìn)行跨平臺封裝

· 提供跨平臺上下文切換接口,主要用于協(xié)程實(shí)現,切換效率非常高

壓縮庫

· 支持zlib/zlibraw/gzip的壓縮與解壓(需要第三方zlib庫支持)。

字符編碼庫

· 支持utf8、utf16、gbk、gb2312、uc2、uc4 之間的互相轉碼,并且支持大小端格式。

實(shí)用工具庫

· 實(shí)現base64/32編解碼

· 實(shí)現crc32、adler32、md5、sha1等常用hash算法

· 實(shí)現日志輸出、斷言等輔助調試工具

· 實(shí)現url編解碼

· 實(shí)現位操作相關(guān)接口,支持各種數據格式的解析,可以對8bits、16bits、32bits、64bits、float、double以及任意bits的字段進(jìn)行解析操作,并且同時(shí)支持大端、小端和本地端模式,并針對部分操作進(jìn)行了優(yōu)化,像static_stream、stream都有相關(guān)接口對其進(jìn)行了封裝,方便在流上進(jìn)行快速數據解析。

· 實(shí)現swap16、swap32、swap64等位交換操作,并針對各個(gè)平臺進(jìn)行了優(yōu)化。

· 實(shí)現一些高級的位處理接口,例如:位0的快速統計、前導0和前導1的快速位計數、后導01的快速位計數。

· 實(shí)現單例模塊,可以對靜態(tài)對象、實(shí)例對象進(jìn)行快速的單例封裝,實(shí)現全局線(xiàn)程安全。

· 實(shí)現option模塊,對命令行參數進(jìn)行解析,提供快速方便的命令行選項建立和解析操作,對于寫(xiě)終端程序還是很有幫助的。

正則表達式庫

· 支持匹配和替換操作

· 支持全局、多行、大小寫(xiě)不敏感等模式

· 使用pcre, pcre2和posix正則庫

一些使用tbox的項目

gbox

vm86

xmake

itrace

更多項目

編譯

請先安裝: xmake

# 默認直接編譯當前主機平臺
$ cd ./tbox
$ xmake

#
 編譯mingw平臺
$ cd ./tbox
$ xmake f -p mingw --sdk=/home/mingwsdk
$ xmake

#
 編譯iphoneos平臺
$ cd ./tbox
$ xmake f -p iphoneos
$ xmake

#
 編譯android平臺
$ cd ./tbox
$ xmake f -p android --ndk=xxxxx
$ xmake

#
 交叉編譯
$ cd ./tbox
$ xmake f -p linux --sdk=/home/sdk #--bin=/home/sdk/bin
$ xmake

例子

#include "tbox/tbox.h"
int main(int argc, char** argv){
    // init tbox
    if (!tb_init(tb_null, tb_null)) return 0;
    // trace
    tb_trace_i("hello tbox");
    // init vector
    tb_vector_ref_t vector = tb_vector_init(0, tb_element_str(tb_true));
    if (vector)
    {
        // insert item
        tb_vector_insert_tail(vector"hello");
        tb_vector_insert_tail(vector"tbox");
        // dump all items
        tb_for_all (tb_char_t const*, cstr, vector)
        {
            // trace
            tb_trace_i("%s", cstr);
        }
        // exit vector
        tb_vector_exit(vector);
    }
    // init stream
    tb_stream_ref_t stream = tb_stream_init_from_url("http://www.xxx.com/file.txt");
    if (stream)
    {
        // open stream
        if (tb_stream_open(stream))
        {
            // read line
            tb_long_t size = 0;
            tb_char_t line[TB_STREAM_BLOCK_MAXN];
            while ((size = tb_stream_bread_line(stream, line, sizeof(line))) >= 0)
            {
                // trace
                tb_trace_i("line: %s", line);
            }
        }
        // exit stream
        tb_stream_exit(stream);
    }
    // wait
    tb_getchar();
    // exit tbox
    tb_exit();
    return 0;
}

文章來(lái)源于網(wǎng)絡(luò ),僅用于學(xué)習傳播,版權歸原作者所有,如有侵權,請聯(lián)系刪除。



評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>