Java里有个ByteBuffer, C++没有, 操作字节流各种不方便
网上有各种版本的ByteBuffer实现, 要么感觉效率太低, 要么实现太复杂, 于是自己实现了一个
字节操作要注意的地方
(1). 尽量的减少 malloc, free 的调用次数
(2). 尽量的减少 memcpy, memmove 的调用次数
针对(1), CBytesBuffer的实现, 初始化时不进行分配内存, 即使你定义了一个 CBytesBuffer 放着不用也不会占多大内存
第一次调用 writebegin() 时发现未申请内存才申请
申请时按内存页的大小进行申请, 保证申请速度
针对(2), CBytesBuffer为了减少 memcpy, memmove的调用次数, 每当从 CBytesBuffer 读取数据后,
只是对[数据的指针]作偏移, 指向下一个要读取的字节
缓冲区的大小是有限的, 在多次读取, 写入操作后, [数据的指针]会 偏移到 缓冲区的末尾
这时候,有人会想到 环型缓冲区(ringbuffer)
如果操作系统提供这么一组API, 指定一个缓冲区为buffer为ringbuffer, 在缓冲区足够在的情况下,
一直把地址向高地址偏移就可以了
网上有另一个实现 BipBuffer.h, 使用了两个缓冲区去做这件事情, 个人觉得太复杂了
在 CBytesBuffer 的实现中, 当[数据的指针]移到缓冲区末尾时, 先看看缓冲区是否足够大
如果够大, 那么就用 memmove, 把数据移到缓冲区前端
如果不够大那么就用 realloc 重新分配缓冲区
另外提供了 compact() 方法, 可以定时调用释放内存
源码详见:
https://github.com/sleepwom/gdk/blob/master/inc/common/bytesbuffer.h
https://github.com/sleepwom/gdk/blob/master/src/common/bytesbuffer.cpp
用法:
https://github.com/sleepwom/gdk/blob/master/test/main.cpp