libhv源码学习--hbuf实现

  hbuflibhv框架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会自己管理分配内存
    <
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ticks_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值