注意:本文翻译自  http://developer.qt.nokia.com   中的  UsingQStringEffectively   ,中文译文见  简体中文版 ,如果你对翻译wiki感兴趣,请参考Wiki中文帮助

本文解释了QString相关的各个类的用途。

QLatin1String:避免操作符 "==" 中隐含的 malloc

从C字符串创建一个QString可能会涉及到malloc。举例来说,下面的代码可能会有一个隐式malloc调用的代价。

  if (fruit == "apple") { ... } // possibly hidden malloc

QString 为C字符串提供了重载的比较函数 QString::operator==(const char *)。而C字符串的编码是使用QTextCodec::setCodecForCStrings()来确定的。Qt 通过提供一个特殊的比较Unicode字符串(fruit)和Latin-1字符串('apple')的函数来执行上述比较操作。该比较操作很快且不需要malloc。

尽管如此,当QTextCodec::setCodecForCString被设置后,"apple" 将通过 QString::fromAscii() 被转换成一个QString。这意味这QString在执行比较之前将为字符串 "apple" 分配内存并创建C字符串的一个深拷贝!

应用程序开发者在main()函数中设置 QTextCodec::setCodecForCString() 却没有意识到对每一个C风格字符串的比较都有一个malloc的副作用。

由于在程序中和Latin-1编码的C字符串的比较非常常见。Qt提供了一个握有Latin-1编码C字符串指针的被称作 QLatin1String 的特殊的类。除此之外,QString 提供了重载的 QString::operator==(const QLatin1String &) 来调用比较Unicode字符串和Latin1字符串的特殊函数。我们通过写成下面这样可以使上面的代码确定无疑地很快(即无论是是否设置了setCodecForCString),

    if (fruit== QLatin1String("apple")) { ... } // fast and mentions encoding

在Qt自身代码中,所有的C字符串的比较都使用了QLatin1String,这是因为应用程序可以为C字符串选择任意编码。

QStringRef:没有 malloc 的字符串操作

QString 为字符串操作提供了各种成员比如mid()、left()、right()。它们都创建会一个新的字符串,因此有一个对在已存在QString的malloc和深拷贝。 与此相反,QString::midRef()、QString::leftRef()与QString::rightRef()可以用来获取一个QStringRef。QStringRef 是对QString一部分的一个引用。为了优化,QString 也提供了许多重载比如 QString::operator==(const QStringRef &) 来配合QStringRef。

QString::reserve 与 QString::squeeze

最好提前调用 QString::reserve 来分配额外的内存,这样每次调用 QString::append() 不会导致一个 malloc。额外的内存可以使用 QString::squeeze 来回收。

QStringBuilder:字符串的快速连接

下面的代码需要至少两次 malloc。第一次molloc用来存放 "(" + type 的结果。然后另一个malloc用来追加 ")"。随着操作符"+"的增加molloc的书目相应增加。

   if (foo.startsWith("(" + type + ")"))

如果最终字符串的长度提前已知的话,额外的malloc就可以避免。Qt 4.6 引入了一个为单次调用的连接链(concatenation chain)预留内存的名为 QStringBuilder 的内部类。它通过为上面的每个+操作返回一个不同的类(不再是QString)来实现这一点。该类跟踪被追加的每个字符串和每一步需要的内存。在最后一步,当连接操作被转换成一个QString时它将分配一次内存并将所有字符串依次拷贝进来。该特性可以通过QT_USE_FAST_CONCATENATION来启用。有了这个定义,我们可以使用操作符 "%" 而不是 "+"。现在可以这样写,

  if (foo.startsWith("(" % type % ")"))

通过定义 QT_USE_FAST_OPERATOR_PLUS, '+' 而不是 '%' 可以被使用。更多细节详见  快速连接

QStringMatcher:字符串快速匹配

QStringMatcher 可被用来在许多字符串中迭代查找一个字符串或者在同一个字符串中查找多次。它使用  Boyer-Moore 字符串搜索算法 来实现快速搜索。

http://blog.csdn.net/dbzhang800/article/details/6567197

QtInternal 之 高效使用QString(使用QLatin1String,QStringRef,QStringBuilder,QStringMatcher等相关类)的更多相关文章

  1. QtInternal 之 高效使用QString

    注意:本文翻译自  http://developer.qt.nokia.com   中的  UsingQStringEffectively   ,中文译文见  简体中文版 ,如果你对翻译wiki感兴趣 ...

  2. 封装QtCore(在非Qt项目里使用QString,QJson,QFileInfo,QFile等类)

    单独封装QtCore 一直以来使用QT的特性使用惯了,很多东西QT都封装得很好.如果突然有一天,不使用QT开发了,是不是不习惯. 比如我们经常使用QString很多方法,string,wstring之 ...

  3. QString::QString 中文乱码

    QString::QString 中文乱码 处理方法: 1. QString str = QString::fromLocal8Bit("中文"); // vs2008 vs200 ...

  4. Qt隐式共享机制

    1.浅拷贝 浅拷贝-引用类型.浅拷贝是指源对象与拷贝对象共用一份实体,仅仅是引用的变量不同(名称不同),对其中任何一个对象的改动都会影响另外一个对象. 2.深拷贝 而深拷贝-值类型.深拷贝是指源对象与 ...

  5. QString 乱谈(1)

    一个月前尝试写了一篇关于QStringLiteral,存盘时MoinMoin罢工了.吸取一点经验,还是写成短篇吧 可是,可是,QString不就是简简单单一个字符串么?能有什么可谈的.真的么... ( ...

  6. QString介绍

    QString stores a string of 16-bit QChars, where each QChar corresponds one Unicode 4.0 character. 一. ...

  7. QT字符串高效拼接原理QStringBuilder

    这一篇文章讨论QT框架中QT字符串是如何实现高效拼接的. 1. QStringBuilder实例与原理 QT字符串高效拼接例子 备注: (a)上述代码仅仅在s2 = b1时一次性分配能够容纳所有字符串 ...

  8. 关于QStringRef

      QString 为字符串操作提供了各种成员比如mid().left().right().它们都创建会一个新的字符串,因此有一个对在已存在QString的malloc和深拷贝. 与此相反,QStri ...

  9. Qt下 QString转char*

    Qt下面,字符串都用QString,确实给开发者提供了方便.Qt再使用第三方开源库时,由于库的类型基本上都是标准的类型,字符串遇的多的就是Char*类型 Qt再使用第三方开源库时,由于库的类型基本上都 ...

随机推荐

  1. S3C6410 GPIO操作接口

    在后面的驱动学习中,需要对GPIO进行一系列的操作,了解这些引脚操作有助于编码的效率. 一.配置GPIO S3C6410要使用其引脚时,需要对其进行配置,如配置为输入/输出/中断等功能,根据芯片手册来 ...

  2. HDU3853-LOOPS(概率DP求期望)

    LOOPS Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 125536/65536 K (Java/Others) Total Su ...

  3. HTTP初步注解

    搜集了一下网上的资源和自己看过的一些书,小小总结了一波HTTP,现在也只是很肤浅的了解,期望以后深入理解后能写出更有营养的笔记. HTTP协议的主要特点 + 支持客户/服务器模式.+ 简单快速:客户向 ...

  4. POJ 2406 Power Strings(字符串的最小循环节)

    题目链接:http://poj.org/problem?id=2406 题意:确定字符串最多是多少个相同的字串重复连接而成的 思路:关键是找到字符串的最小循环节 code: #include < ...

  5. mysql 存储过程需要DELIMITER

    DELIMITER &&CREATE PROCEDURE syncAdvertiser() BEGIN DECLARE id bigint; DECLARE _cur CURSOR F ...

  6. 加密PHP文件的方式,目测这样可以写个DLL来加密了

    <?php function encode_file_contents($filename) { $type=strtolower(substr(strrchr($filename,'.'),1 ...

  7. centos6.5安装pysider遇见的坑

    一.服务器自带pyhon2.7.9 安装pip, # yum -y install python-devel python-setuptool wget http://pypi.python.org/ ...

  8. Spark学习资料

    1. 倾情大奉送--Spark入门实战系列 2. Spark GraphX: http://blog.csdn.net/bluejoe2000/article/details/44308167

  9. tomcat 会话超时设置

    1.为单个WEB设置SESSION 在WEB.XML中添加 xml 代码 <session-config> <session-timeout>15</session-ti ...

  10. Spring Boot Logback应用日志

    e Spring Boot Logback应用日志 2015-09-08 19:57 7673人阅读 评论(0) 收藏 举报 . 分类: Spring Boot(51) . 目录(?)[+] 日志对于 ...