QString性能优化小Tips
- 2020 年 4 月 1 日
- 筆記
❝在项目文件中添加一句
DEFINES *= QT_USE_QSTRINGBUILDER
即可优化QString性能。 ❞
下面的代码底层实现需要至少2个malloc。第一个malloc是"Hello"字符串,另一个malloc是"world!"字符串。并且每次添加时,malloc的数量都会增加。
QString space = " "; QString str = "Hello" + space + "world!";
如果最终QString的长度事先已知,则可以避免额外的malloc。因此在Qt 4.6中引入了QStringBuilder的内部类,该类可以一次为连接链保留内存。通过使上面的每个+
操作返回不同的类(不再是QString)来实现此目的。此类跟踪每个步骤中要附加的字符串和所需的内存。在最后一步转换为QString时,它将在一次分配所需内存,并按顺序复制链中的所有字符串。
启用该功能需要包含头文件#include <QStringBuilder>
并使用operator %
操作符。例如:
QString space = " "; QString str = "Hello" % space % "world!";
另外,QStringBuilder使用表达式模板并重新实现%
运算符,这样当你将%
用于字符串连接而不是+
时,「多个子字符串连接将被延迟,直到最终结果将被分配给一个QString」。在这一点上,最终结果所需的内存是已知的。然后调用内存分配器一次以获得所需的空间,并将子字符串逐个复制到其中。
通过内联和减少引用计数可以获得额外的效率(从QStringBuilder创建的QString通常有一个1的引用计数,而QString::append()
需要额外的测试花销)。
「此外我们还可以在项目文件(*.pro)中加入下列代码自动让+
识别为%
操作符,这样可以用最少的修改来达到QString的性能优化」。
DEFINES *= QT_USE_QSTRINGBUILDER