QT字符串高效拼接原理QStringBuilder
这一篇文章讨论QT框架中QT字符串是如何实现高效拼接的。
1. QStringBuilder实例与原理
QT字符串高效拼接例子

备注:
(a)上述代码仅仅在s2 = b1时一次性分配能够容纳所有字符串的内存。
(b)定义两个符号之一即可使用operator+实现高效字符串拼接。
QT_USE_FAST_OPERATOR_PLUS
QT_USE_QSTRINGBUILDER
QStringBuilder原理
QStringBuilder提升字符串拼接性能的原理是什么?
(1)QStringBuilder是一个模板, QStringBuilder<A, B>。
(2)内部仅仅保存了构造时传入的各种类型的字符串的引用。
(3)模板参数又可以嵌套一个QStringBuilder。
(4)最后需要获取拼接结果时,执行operator QString()类型转换。
在这个转换中先计算总的字符串长度,然后一次性分配内存,构造出符合长度要求的QString,最后将各个组成部分拷贝到这个字符串中。
(5)整个拼接过程只需要分配一次内存,构造一个QString字符串作为最终拼接结果。中间不构造任何临时字符串。
2. 自己实现字符串高效拼接
目标

备注:
(a)重载operator%运算符时必须至少有一个参数是类类型或者枚举类型。
因此不能直接实现两个原始字符串的%运算。
可连接类型

备注:
(a)这个类型关注具体如何进行连接操作,以及连接之后应该有多大。
为什么这个类型看起来并没有任何关于如何进行连接操作以及连接之后应该有多大的函数或者属性定义呢?这个是默认通用版本,通用版本无法确定数据类型,当然也就无法确定这些关注点,针对具体类型的特化版本才能确定这些关注点。
类型选择类型

备注:
(a)这个类型关注两个类型连接之后的结果类型是什么类型。
字符串拼接类型


备注:
(a)这个类型相当于字符串连接的一个总控程序。
特化版本: ButianyunStringBuilder
思考:
问题:类模板的特化版本中的模板参数是否可以比通用版本的模板参数更多呢?
答案:显然是可以的。ButianyunConcatenable就是这么一个具体的实例。

思考
问题:
根据ButianyunConvertHelper的定义,A和B连接后的新类型为A。
为什么不直接在这里定义A为ConvertToType,而是搞出来ButianyunConvertHelper这个模板呢?
答案:
ButianyunConvertHelper的价值是什么? 核心价值在于特化版本可以根据A和B的具体情况来定义A和B哪一个类型作为新类型。 在ButianyunConcatenable中无需关注这个问题。 如果不定义这个模板,直接定义A为ConvertToType则为硬编码。
将A和B连接后的新类型的决定权较给了这个类型外部的ButianyunConvertHelper。
ButianyunConcatenable关注如何连接这件事情本身,而ButianyunConvertHelper关注类型。 优点是简化了ButianyunConcatenable的代码。 因此本质是关注点分离的思想。

特化版本:QLatin1String

特化版本: 原始字符数组

字符串连接函数

运算符重载:operator%

备注:
(a)这个运算符重载相当于对外提供了一个简化版本的API接口。
3. 总结
如果自己按照QT框架中QStringBuilder原理实现了字符串高效拼接则对QStringBuilder就有了更深入的认识了,对一个概念和用法做到知其然知其所以然。本文前面介绍的ButianyunStringBuilder实现基本上是QT框架中QStringBuilder的源码实现的简化版本。理解了ButianyunStringBuilder源代码基本上就已经掌握了QStringBuilder的源代码。
这个代码中使用了一些C++模板编程技术。C++模板编程技术本质上是一种取舍权衡之道,使用编译时间换取运行时间,也就是代码编译时间可能多一点,程序运行时的性能可能高一点。QT框架源代码很多时候为了追求运行时期的性能而使用了C++模板编程技术,使得源代码看起来有一点晦涩难懂。因此必须熟练掌握C++模板编程技术才能更好的掌握QT框架源代码。对于QT框架为什么使用这种模板编程技术,个人理解可能是这样的:QT框架的最大的特点在于易用性,但是QT框架中的很多基础设施又不想损失运行时期性能,那么自然而然就使用C++模板编程技术;当然有得必有失,损失一点源代码的可读性也可以算是提升了一点阅读源代码的门槛也就是很正常的事情;另外对于熟练掌握C++模板编程技术的软件工程师而言可能也不算什么门槛。
如果想更好的掌握C++,可以多看一些优秀的大型框架的源代码。这些大型框架经过多年沉淀,往往有一些比较优秀的编程思想。个人理解,掌握一些最基本最本质的编程思想可能比掌握一些框架的模拟两可的概念或者一些表面的API用法更实在一些,收益也更大一些。这也是在探索和分析QT源代码的过程中产生的一点可能在一些大佬看起来可能不值得一提的一点个人想法。

QT字符串高效拼接原理QStringBuilder的更多相关文章
- js 高效拼接字符串
<script>//如果我们大量使用+=进行字符串拼接的话,将会使界面失去响应(卡死状态) //高效拼接字符串 var StringBuilder=function() { this.da ...
- 树形菜单的json字符串的拼接
最近在学习权限管理, 要用到树形按钮, 但是字符串的拼接是一个难理解的问题, 然后从网上找了一个从前台用js来遍历组成这个json字符串, 很好! 但是没看懂... var data = [ {&qu ...
- 剖析Qt的事件机制原理
版权声明 请尊重原创作品.转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正. QT源码解析(一) QT创建窗口程序.消息循环和WinMai ...
- oracle操作字符串:拼接、替换、截取、查找
1.拼接字符串 1)可以使用“||”来拼接字符串 select '拼接'||'字符串' as str from dual 2)通过concat()函数实现 select concat('拼接', '字 ...
- oracle操作字符串:拼接、替换、截取、查找、长度、判断
1.拼接字符串 1)可以使用“||”来拼接字符串 select '拼接'||'字符串' as str from dual 2)通过concat()函数实现 select concat('拼接', '字 ...
- 关于vb编程之字符串连接/拼接的方法与技巧
在VB中,笔者知道的字符串的拼接方法主要有两种拼接符号,一种为"&"符,另一种则为"+"符 一.其中&连接运算符用于强制将两个表达式作为字符串连 ...
- epoll的高效实现原理
epoll的高效实现原理 原文地址:http://blog.chinaunix.net/space.php?uid=26423908&do=blog&id=3058905 开发高性能网 ...
- MySql、Oracle、MSSQL中的字符串的拼接
字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...
- [转]mysql中的字符串的拼接
字符串的拼接 1,Mysql 在Java.C#等编程语言中字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"."a"+"b ...
随机推荐
- win10设置开机自启动程序
问题情境:前两天刚刚给自己的win10系统美化了一下,但发现一个问题,每次开机都需要双击启动一个程序,才能达到一个我想要的效果,所以就在思考能不能将这个程序设为开机自启动项呢? 1.首先,找到启动文件 ...
- layui下拉框渲染问题,以及回显问题
最近实习公司给的新人练手项目用的layui,layui之前自己也接触过但是也就是用了用table组件,没有用过layer弹层这些东西,所以就了解了一下. 首先遇到的一个问题就是下拉框没有样式,然后加样 ...
- 2021.11.03 P6175 无向图的最小环问题
2021.11.03 P6175 无向图的最小环问题 P6175 无向图的最小环问题 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 题意: 给定一张无向图,求图中一个至少包含 33 ...
- 【Vue3+Express实战】项目开发环境搭建
大家好,我是半夏,一个刚刚开始写文的沙雕程序员.如果喜欢我的文章,可以关注 点赞 加我微信:frontendpicker,一起学习交流前端,成为更优秀的工程师-关注公众号:搞前端的半夏,了解更多前端知 ...
- ASP.NETCore统一处理404错误都有哪些方式?
当未找到网页并且应用程序返回 404 错误时,ASP.NET Core MVC 仅呈现通用浏览器错误页面,如下图所示 这不是很优雅,是吗? 我们平时看到的404页面一般是这样的 还有这样的 试了下京东 ...
- WEB安全信息收集
目录 信息收集 子域名&敏感信息 敏感信息收集--Googlehack 敏感信息收集--收集方向 空间测绘引擎域名资产收集 子域名收集 WEB指纹 端口扫描 IP查询 cms识别 WAF识别 ...
- shiro550反序列学习
Shiro550 shiro550和fastjson作为攻防演练的利器,前面学习了fastjson的相关利用和回显,本篇主要来学习一下shiro550的漏洞原理. 1.漏洞原因 在 Shiro < ...
- XCTF练习题---MISC---Hidden-Message
XCTF练习题---MISC---Hidden-Message flag:Heisenberg 解题步骤: 1.观察题目,下载附件 2.拿到手以后发现是一个数据包格式,打开看一下 3.查看UDP流,并 ...
- XCTF练习题---MISC---如来十三掌
XCTF练习题---MISC---如来十三掌 flag:flag{bdscjhbkzmnfrdhbvckijndskvbkjdsab} 解题步骤: 1.观察题目,下载附件进行查看 2.打开附件,压根看 ...
- XCTF练习题---MISC---pdf
XCTF练习题---CRYPTO---混合编码解析 flag:flag{security_through_obscurity} 解题步骤: 1.观察题目,下载附件 2.根据题目提示,下载文件,发现是一 ...