为了最大化资源使用,和最小化数据拷贝,Qt在很多类中用到了隐式数据共享,以便数据仅在被写入时才被拷贝。该机制也被称为flyweight模式。
让我们以QByteArray为例,看看其是如何实现的。其内部使用一个名为Data的私有结构体来追踪共享的数据:
这里,如果数据保存在其他位置,则需要用到data来指向实际的数据位置;如果保存在自身,则是array指向的位置。当对象被拷贝时(比如通过赋值运算符),则仅仅拷贝指针,而不拷贝数据本身:
另一方面,如果共享的数据要被修改(比如通过resize()函数),则会自动拷贝之:
现在让我们来看看如何使用QSharedData和QSharedDataPointer来创建自己的共享数据对象。
相当简单,没错吧!好了,有兴趣的朋友可以用QExplicitlySharedDataPointer来创建显式的数据共享;)