隐式共享(Implicit Sharing)

今天学习QT编程,看到了隐式共享的编程思想,看完后收获颇丰富,因此有感而写一篇文章记录下来。
隐式共享(Implicit Sharing)又称为写时复制(copy-on-write)。采用隐式共享的目的是尽可能地提高资源使用率和减少复制操作。下面通过代码来体现其设计的高效性。

QPixmap p1,p2;
p1.load("img.png");
p2= p1;
QPainter paint;
paint.begin(&p2);
paint.drawText(0,50,"Hi");
paint.end();

QPixmap 采用的是隐式共享。共享类包含了一个指向共享数据块的指针和数据组成,在共享数据块中包含了一个引用计数。首先QPixmap 创建两个字符串对象p1,p2。p1,p2的引用计数被初始化为1。
引用计数的运算规则:每当有新的对象引用了共享数据时会进行加一递增,而当有对象不再引用该共享数据时,引用计数会减一递减。当引用计数为0时,这个共享数据就会被销毁。
在这里p1,p2的引用计数为1,程序执行到p2 = p1之后,p2和p1就共享同一个数据。p1的引用计数为2,p2的引用计数为0,所以p2以前指向的内存被销毁。
p2 = p1同时还进行了浅拷贝(将p1的引用传递给p2)。而当一个对象被修改时如paint.begin(&p2)是深拷贝。
隐式共享在后台进行,在实际编程中一般不需要去关注它。QT中采用隐式共享的类还包括:
QByteArray、QCursor、QFont、QPixmap、QString、QVariant和所有的容器类

你可能感兴趣的:(隐式共享(Implicit Sharing))