qt 二维地图库_Qt轻量级地图解决方案:基于QtLocation的二次开发(四)

写在前面

在本系列的上一篇中,我将从《Qt之美1:数据指针和私有实现》中的例子抄过来,说明了Qt中源码中(同时也是QtLcation模块中)大量存在的D-P机制。这种设计模式实现了动态库的二进制兼容,同时也隐藏了私有成员和潜在的实现细节;除此之外,还能基于它实现另一种Qt中大量采用的技术,即“隐式共享技术”。

以下关于“隐式共享技术”的说明内容,大多出自《Qt中的C++技术》这本书的第8章《隐式共享与d-pointer技术》。

一般地,一个类型的多个实例所占内存是相互独立的,如果其中某些数据成员的取值完全相同,那么这些实例可共享这些数据成员,当某实例需要修改其中的数据成员时才为该对象重新分配内存;这种技术被称为“隐式共享技术”,又被形象地描述为“写时复制(copy on write)”。如下图所示,假如对象O1、O2、O3和O4都有部分数据成员取值相同,都共享这部分数据成员所占用的内存A;此后需要修改O4位于共享内存A中的某个数据成员,此时不能直接修改内存A,否则会影响O1、O2和O3的数据成员;只好先复制将内存A复制成B,然后重新分配给O4,在B中修改O4需要修改的数据成员。

a9e0714ccd6f3ea0cd2f87bb843c3818.png

由于共享内存A的存在,假如要析构O3时,O1和O2还未析构,则不能简单地释放共享内存A,因为这样做会使O1和O2受到牵连。只有当仅存在一个对象引用共享内存时,析构这个仅存的实例才完全释放共享内存,其他时候仅需要“断开”析构实例与共享内存的引用关系即可。这就需要维护一个共享内存的引用计数器(reference counter),每当析构了一个引用该块共享内存的对象时,就减少一个引用计数,直到引用计数为1(即仅存一个引用该内存块的对象)时,下一次再进行减少引用计数的操作(即析构引用该内存的对象)才会完全释放这块内存。

刚才我们讲了同一类型不同实例之间实现隐式共享的基本原理,但这并不适用于所有应用场景。其实,Qt已经在“隐式共享技术”上为我们做了很多基础性和示范性工作,其提供了一个名为QSharedData的共享数据类型,还提供了QSharedDataPointer等共享数据类的指针,利用QSharedData和QSharedDataPointer等类型就可以实现隐式共享的进阶操作,比如同一基类不同子类之间的隐式共享。

了解QGeoShape为基类的地理数据类型

这里以QtPositioning中QGeoShape类型体系的源码作为示例

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值