首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >QString性能优化小Tips

QString性能优化小Tips

作者头像
Qt君
发布2020-04-01 11:18:19
发布2020-04-01 11:18:19
1.6K0
举报
文章被收录于专栏:跟Qt君学编程跟Qt君学编程

❝在项目文件中添加一句DEFINES *= QT_USE_QSTRINGBUILDER即可优化QString性能。 ❞

  下面的代码底层实现需要至少2个malloc。第一个malloc是"Hello"字符串,另一个malloc是"world!"字符串。并且每次添加时,malloc的数量都会增加。

代码语言:javascript
复制
QString space = " ";
QString str = "Hello" + space + "world!";

  如果最终QString的长度事先已知,则可以避免额外的malloc。因此在Qt 4.6中引入了QStringBuilder的内部类,该类可以一次为连接链保留内存。通过使上面的每个+操作返回不同的类(不再是QString)来实现此目的。此类跟踪每个步骤中要附加的字符串和所需的内存。在最后一步转换为QString时,它将在一次分配所需内存,并按顺序复制链中的所有字符串。

  启用该功能需要包含头文件#include <QStringBuilder>并使用operator %操作符。例如:

代码语言:javascript
复制
QString space = " ";
QString str = "Hello" % space % "world!";

  另外,QStringBuilder使用表达式模板并重新实现%运算符,这样当你将%用于字符串连接而不是+时,「多个子字符串连接将被延迟,直到最终结果将被分配给一个QString」。在这一点上,最终结果所需的内存是已知的。然后调用内存分配器一次以获得所需的空间,并将子字符串逐个复制到其中。

  通过内联和减少引用计数可以获得额外的效率(从QStringBuilder创建的QString通常有一个1的引用计数,而QString::append()需要额外的测试花销)。

「此外我们还可以在项目文件(*.pro)中加入下列代码自动让+识别为%操作符,这样可以用最少的修改来达到QString的性能优化」

代码语言:javascript
复制
DEFINES *= QT_USE_QSTRINGBUILDER
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Qt君 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档