学习ZLToolKit(第一天)

本文记录了学习ZLToolKit的第一天,重点研究了Utils包下的List.h和ResourcePool.h。List.h中定义了一个继承自std::list的List类,提供可变参数模板和高效的操作方法。ResourcePool.h涉及资源池管理,根据编译器类型和版本定义宏,使用智能指针管理内存,支持动态模板和循环池大小设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    今天是学习ZLToolKit的第一天,对其了解不多,仅能通过看作者介绍进行了解。

一、List.h

    将其下载到了cent os虚拟机中,并通过查看对头文件的引用,确定了首先要对Utils包下的List.h为第一个要学习的文件。

#ifndef ZLTOOLKIT_LIST_H

#define ZLTOOLKIT_LIST_H

这段代码的使用是确保List.h只会被编译一次。

class List : public std::list<T>

编写继承list的List类

template<typename ... ARGS>

可变参数模板

std::forward<ARGS>(args)...

在C++11标准下,我们可以组合使用可变参数模板与forwad机制来编写函数,实现将其实参不变地传递给其他的函数。

void append(List<T> &other)

将另一个other的List类中的数据插入到此类的尾部,并清除other中的数据。

template<typename FUNC>

void for_each(FUNC &&func)

使用形参中的func函数对每一个节点的数据进行操作,并用const修饰成员函数(const 函数不能修改成员变量,否则编译会报错)。

二、ResourcePool.h

defined(__GNUC__)  使用gcc编译器

__GNUC__ >= 4 && __GNUC_MINOR__ >= 9  判断gcc版本号是否是在4.9.2之后

#if (defined(__GNUC__) && (__GNUC__ >= 5 || (__GNUC__ >= 4 && __GNUC_MINOR__ >= 9))) || defined(__clang__) \

|| !defined(__GNUC__)

#define SUPPORT_DYNAMIC_TEMPLATE

#endif

如果使用gcc并且版本大于等于4.9.2或者使用的clang或者没使用gcc,那么就定义SUPPORT_DYNAMIC_TEMPLATE,用于下面代码的编译选择。

template <typename C>

class ResourcePool_l;

template <typename C>

class ResourcePool; 将下面定义的类写在上面,使下面定义的类的上方编写的函数或类可以对其进行使用。

template <typename C>

class shared_ptr_imp : public std::shared_ptr<C>

定义一个继承了共享指针的类

    /**

* @param ptr 裸指针

* @param weakPool 管理本指针的循环池

* @param quit 对接是否放弃循环使用

*/

shared_ptr_imp( C *ptr, const std::weak_ptr<ResourcePool_l<C>> &weakPool, std::shared_ptr<std::atomic_bool> quit, const std::function<void(C *)> &on_recycle);

    构造智能指针

void quit(bool flag = true)

    放弃或恢复回到循环池继续使用

    std::shared_ptr<std::atomic_bool> _quit    

    定义一个原子性bool的共享指针

template <typename C>

class ResourcePool_l : public std::enable_shared_from_this<ResourcePool_l<C>>

定义一个可以被共享指针共享的类,用于管理循环池

friend class shared_ptr_imp<C>;

friend class ResourcePool<C>;

加入友类,使友类可以使用ResourcePool_l的私有变量

ResourcePool_l() {

     _alloc = []() -> C * { return new C(); };

}构造函数可以返回创建一个模板中定义变量C的指针

如果SUPPORT_DYNAMIC_TEMPLATE被定义了,那么就可以在构造函数中添加多参数,并将多参数添加到变量C的构造函数中,并创建其指针

~ResourcePool_l()

析构函数将私有变量_objs中的指针全部delete

void setSize(size_t size)

设置循环池的尺寸,并reserve变量_objs的大小为size

ValuePtr obtain(const std::function<void(C *)> &on_recycle = nullptr)

获得一个封装后的共享指针,并将循环池设置为本类,并初始化不放入循环池中

std::shared_ptr<C> obtain2()

获得一个共享指针,并判断其所属的循环池是否存在,如果存在,就将其放入,如果不存在,就删除指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值