CUDA与内存池(三):引用计数的智能指针

智能指针与引用计数

上一篇博客里,将内存池返回的索引包装成了一个指针类,以方便使用。这里介绍一下如何构造一个智能指针,以便更方便地使用。

智能指针使用引用计数进行内存管理。每个对象都记录自己被多少地方所引用。每当增加一个引用的位置时,这个数加1;引用减少时减1。当减到0时,说明没有地方使用这个对象,就将其删除。

引用计数有两种存放方式:一种是作为一个成员,存放于被引用的对象中;另一种是由指针对象管理,单独存放(比如放在堆空间)。这两种各自有优缺点:前者能够更容易地获得计数,并保证计数的唯一性,这在建立与其它语言的binding的时候比较方便。但是被引用物必须是一个含有计数成员的对象。后者对于被引用物的要求比较宽松,可以是非对象的基本类型。在boost库中,shared_ptr和intrusive_ptr就分别采用这两种设计。其中shared_ptr可以引用任何类型,但intrusive_ptr要求用户提供实现引用计数的函数(详见boost的intrusive_ptr文档)。

实现一个智能指针类

在这里,由于物理引擎的特性,我认为不需要计数基本类型,只需要计数那些被内存池管理的对象,而且将来可能建立脚本的binding(也许用Lua吧,API比较简单),因此将引用计数放在对象里。

首先,我们弄一个基类。所有能够使用我们智能指针的类都必须继承这个基类:

class Referenced {
public:
    Referenced (): __refcnt(0)
    {
    }

    uint64_t __refcnt;
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值