Qt中的隐式共享

QString存储了一串QChar,而QChar提供了一个16位的Unicode 4.0字符。在后台,QString使用隐式共享来减少内存使用和避免不必要的数据复制。

1 隐式共享

​ 又称为写时复制
​ 使用隐式共享类作为参数传递是既安全又有效的,因为只有一个指向该数据的指针被传递了,只有当函数向它写入时才会复制该数据。

一个共享类 = 指向一个共享数据块的指针 + 数据组

​ 共享数据块包含了一个引用计数。每当有新的对象引用了数据块,引用计数就会递增,而对象不再引用数据块就会递减。当引用计数为0 时,共享数据块就会被销毁。当处理共享对象时,有两种复制方法:深复制浅复制

深复制:复制一个对象;
浅复制:复制一个引用(仅仅是一个指向该共享数据块的指针)。

​ 当隐式共享类使用“=”操作符时就是使用浅复制。但是当一个对象被修改时,就必须进行一次深复制。
​ 共享的好处是程序不需要进行不必要的数据复制,这样可以减少数据复制、使用更少的内存,对象也可以很容易地被分配,或者作为参数被传递,或者从函数被返回。

​ Qt中隐式共享类:QByteArray、QCursor、QFont、QPixmap、QString、QUrl、QVariant、所有的容器类等

2 QByteArray

​ 提供一个字节数组,可以用来存储原始字节(包括‘\0’)和传统的以‘\0’结尾的8位字符串。

3 QVariant

​ QVariant类像是常见的Qt数据类型的一个共用体,一个QVariant对象在一个时间只保存一个单一类型的单一的值。可以使用toT()(T代表一种数据类型)函数将其转换位T类型,并且获取它的值。

发布了57 篇原创文章 · 获赞 14 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_43343803/article/details/102326268
今日推荐