01Qt中的隐式共享
隐式共享
隐式共享又称为回写复制(copy on write)。当两个对象共享同一分数据时(通过浅拷贝实现数据共享),如果数据不改变,则不进行数据的复制。而当某个对象需要需要改变数据时,则进行深拷贝。
程序在处理共享对象时,使用深拷贝和浅拷贝这两种方式复制对象。所谓深拷贝,就是生成对象的一个完整复制品;而浅拷贝则是一个引用复制(如今复制指向共享数据的指针)。显然,执行一个深拷贝的代价是昂贵的,要占用更多的内存和 CPU 资源;而浅拷贝的效率则很好,他仅需设置一个指向共享数据库的指针几修改引用计数的值。
隐式共享可以降低对内存和 CPU 资源的使用,提高程序的运行效率。它使得在函数中(如参数、返回值)使用值传递更有效率。
QString 类采用隐式共享计数,将深拷贝和浅拷贝有机的结合起来。
#include <QCoreApplication>
#include <QDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QString str1 = "data";
QString str2 = str1;
//QString的data_ptr()函数返回字符存储区地址
qDebug() << "浅拷贝:" ;
qDebug() << "str1.data_ptr(): " << str1.data_ptr();
qDebug() << "str2.data_ptr(): " << str2.data_ptr();
str2[3] = 'e';
str2[0] = 'f';
qDebug() << "深拷贝:" ;
qDebug() << "str1.data_ptr(): " << str1.data_ptr();
qDebug() << "str2.data_ptr(): " << str2.data_ptr();
return a.exec();
}
输出结果为:
道虽迩,不行不至;事虽小,不为不成。