hbuf
是libhv
框架base模块
里面的一个结构,提供缓存类,主要有两个派生类实现:``HVLBuf和HRingBuf,今天主要学习HVLBuf。
HVLBuf是一个支持动态扩容的缓存类,底层使用的是原生C字符串。
下面时libhv的base模块主要文件及功能:
├── array.h 动态数组
├── hatomic.h 原子操作
├── hbase.h 基础函数
├── hbuf.h 缓存
├── hdef.h 常见宏定义
├── heap.h 堆
├── hendian.h 大小端
├── herr.h 错误码表
├── hlog.h 日志
├── hmath.h 数学函数
├── hmutex.h 线程同步锁
├── hplatform.h 平台相关宏
├── hproc.h 进程
├── hsocket.h 套接字
├── hssl.h SSL/TLS
├── hsysinfo.h 系统信息
├── hthread.h 线程
├── htime.h 时间
├── hversion.h 版本
├── list.h 链表
└── queue.h 队列
HVLBuf类继承自HBuf类,而HBuf类又继承自hbuf_t结构体(C++可以看作中为默认属性为public的类),要研究HVLBuf就先来一层一层剥离,先来看看hbuf_t结构体
typedef struct hbuf_s {
// 指向buf内存的指针
char* base;
// buf内存大小
size_t len;
// 如果为c++,就变成了类,提供两个构造函数
#ifdef __cplusplus
hbuf_s() {
base = NULL;
len = 0;
}
// 第一个参数指定buf的内存地址,第二个参数指定内存大小
hbuf_s(void* data, size_t len) {
this->base = (char*)data;
this->len = len;
}
#endif
} hbuf_t;
从hbuf_t结构体定义可以看出,hubf_t主要有两个成员,一个为buf内存指针,一个为指向的内存区域的大小。
看完hbuf_t再来看看Hbuf类,还是先给出定义:
// HBuf -> 继承自hbuf_t
class HBuf : public hbuf_t {
public:
HBuf() : hbuf_t() {
cleanup_ = false;
}
HBuf(void* data, size_t len) : hbuf_t(data, len) {
cleanup_ = false;
}
// 只指定大小,自己分配内存
HBuf(size_t cap) {
resize(cap); }
virtual ~HBuf() {
cleanup();
}
// 获取缓冲区
void* data() {
return base; }
// 获取缓冲区大小
size_t size() {
return len; }
// 判断缓冲区是否为空
bool isNull() {
return base == NULL || len == 0; }
// 清理内存
void cleanup() {
// 判断base需不需要由Hbuf来释放
if (cleanup_) {
HV_FREE(base);
len = 0;
cleanup_ = false;
}
}
// 为base分配内存,此时Hbuf会自己管理分配内存
<