北京市住房城乡建设行业从业人员考务网站,网络公司做网站的合同,一建 专业,网站后台怎么建设qt提供了比标准c string更强大#xff0c;更丰富#xff0c;更实用的字符串类QString#xff0c;它的主要功能22个已经在之前逐一分析过#xff0c;感兴趣的可前往以下链接查看#xff0c;本文主要重点分析下qt在字符串类上面做的优化#xff0c;主要是两个方面#xff… qt提供了比标准c string更强大更丰富更实用的字符串类QString它的主要功能22个已经在之前逐一分析过感兴趣的可前往以下链接查看本文主要重点分析下qt在字符串类上面做的优化主要是两个方面隐式共享和内存分配策略。 9-Qt6 QString和QChar_qchar qstring_闫有尽意无琼的博客-CSDN博客https://yanchenyu.blog.csdn.net/article/details/119640571 也可关注官方文档
QString Class | Qt Core 6.5.0https://doc.qt.io/qt-6/qstring.html#details
一、隐式共享 共享类由一个共享数据块及指向这个块的计数器组成当共享对象被创建这个块的计数器的值会被设置为1并且当有新的对象指向共享数据库那么他的计数器就会1当对象不指向这个内存块时计数器会减少当计数器为0时这个共享块将会被删除。 简单的说当两个对象共享同一份数据时如果数据不改变则不进行数据的复制(仅浅拷贝)而当数据改变时则进行数据复制即进行深拷贝。
浅拷贝只做两件事情设置一个指向共享数据块的指针再修改引用计数的值
深拷贝生成一个对象的完整复制品
显然深拷贝对资源的占用比如cpu、内存等将需要花费更多的资源而浅拷贝仅仅是指针引用和计数效率会非常高。
Qt的隐式共享技术就是把浅拷贝和深度拷贝结合起来以提高运行效率的同时还是资源占用降低。以下代码解释
QString str1china;qDebug()str1str1.data_ptr();QString str2str1;qDebug()str2str2.data_ptr();str2.at(0);qDebug()str2.at(0)str2.data_ptr();str2[0]a;qDebug()str2str2.data_ptr();qDebug()str1str1.data_ptr(); 当第一次str2str1可以看到地址并未变化说明仅发生了浅拷贝它们指向同一个内容。
紧接着我们调用at去访问str2首元素后地址仍未变化
最后修改str2的第一个元素后str2地址发生变化因为已经进行了深拷贝也就是说它指向的数据结构已经是新的区域指针地址也随之发生变化即新的地址新的值但str1此时地址仍未变化即最初的地址也是最初的值。
以上充分说明了qt是深拷贝和浅拷贝进行结合使用以最大化的减少资源占用就是这一点一滴不知不觉的优化积累起来提高效率。
二、内存分配策略
容器类 |Qt核心6.5.0https://doc.qt.io/qt-6/containers.html 那我也用代码展示了内存分配情况的确是文档中描述的可以是8,24,56,120…… //上面qt6官方文档是如上面描述 通过实验可以得出结论qt6在内存方面发生了新变化确实内存在以16的次方在增加而不是再是所谓的qt5中众说纷纭的三种情况分配了。截止23年5月号称所谓的qt6的新书还在继续宣扬下面的3种分配方式。 而qt5时描述说分为3种情况 QString每次分配4个字符直到大小达到20个字符当大小在20到4084个字符之间每次分配内存块为当前空间大小即为当前的2倍的速度增长。准确地说是分配下一个2的整数幂减12即2^n-12。这是因为在某些内存分配器中会预分配几个字节的空间用于簿记内存开销实现内存分配的时候会使用Bookkeeping深入了解可前往内存管理内幕中查看“其它malloc实现”因此分配大小为2的整数幂时性能较低。从4084字符开始每次分配2048个字符4096字节即4KB刚好等于一个32位逻辑地址空间计算机系统的页的大小原因是现代操作系统重新分配一个缓冲区时不会将整个数据全部复制隐式共享物理页只进行简单地重新排序实际上只需要复制首页和尾页的数据。 总之无论qt采用过去的3种分配方式还是现在16次方的分配方式qt都是利用隐式共享和动态的内存分配策略优化资源占用提高效率。