QString内部有共享机制。所谓共享机制,就是假若将QString类型的字符串str1赋值给str2,实际str2并没有拷贝str1的数据,只是将str2中一个指向实际数据的指针指向了str1。意味着str1和str2的存储数据的内存是同一块地址。这样就实现了共享,节省内存。
但是,这样带来了问题:假如后面改了str2的数据,那个str1的数据也会跟着改变,这并不是用户想要的结果。
Qt在此问题上采用写时复制机制。也就是,在修改str2的数据时,先申请一块内存,将str1和str2共享的数据拷贝到新的内存中,然后将str2指向新的内存地址,这样str1和str2就不再共享一块内存,修改str2的数据不会影响str1。这就是QString的写时复制。
写时复制(copy-on-write):需要写数据的时候,才进行复制。
一、原理分析
1、QStringData类
QStringData类是Qt的一个内部类,不对外使用。在QString的内部,使用QStringData存储数据。QStringData类是一个模板类QTypeArrayData<ushort>,QTypeArrayData是一个Array模板,也就会一个数组,里面每一个元素就是一个字符,因此每一个字符都是ushort型,大小为2字节,存放的是字符对应的unicode码。
qstringliteral.h