高效地使用QString

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a844651990/article/details/84851753

QStringLiteral(str) 宏

  在编译期间,QStringLiteral宏从字符串常量str中获取QString所需的数据,生成的字符串数据是保存在只读数据段的,创建QString是非常高效的。假如我们不使用QStringLiteral宏,例如:

// hasAttribute takes a QString argument
  if (node.hasAttribute("http-contents-length")) //...

这种情况下会创建一个临时变量QString作为hasAttribute的参数传递过去,这个过程中涉及到内存分配和将数据复制/转换为QString的内部编码,非常低效。使用QStringLiteral宏:

if (node.hasAttribute(QStringLiteral(u"http-contents-length"))) //...

在这种情况下,QString的内部数据将在编译时生成;在运行时不会发生转换或内存分配。常量字符串使用QStringLiteral而不是双引号的纯c++字符串可以显著加快创建QString实例的速度。

QLatin1String

  QLatin1String类提供了一个US-ASCII/Latin-1编码的字符串容器。许多QString的成员函数被重载接受const char *而不是QString类型的参数。包括复制构造函数、赋值操作符、比较操作符,以及各种其他函数,如insert()、replace()和indexOf()。这些函数通常经过优化,避免将const char * 构造成QString。比如,假如str是一个QString,

if (str == "auto" || str == "extern"
          || str == "static" || str == "register") {
      ...
  }

这种写法就比下面这种写法更快,效率更高。

if (str == QString("auto") || str == QString("extern")
        || str == QString("static") || str == QString("register")) {
    ...
}

因为第一种写法不需要构造四个临时QString对象并对字符数据进行深拷贝。
  如果我们在程序钟定义了QT_NO_CAST_FROM_ASCII宏,将不能访问QString的const char *参数类型 API。为了提供一种定义常量Latin-1字符串的有效方法,Qt提供了QLatin1String,它只是一个非常薄浅地包装了const char *。使用QLatin1String,上面的示例代码可以这样写:

if (str == QLatin1String("auto")
          || str == QLatin1String("extern")
          || str == QLatin1String("static")
          || str == QLatin1String("register") {
      ...
}

代码量多了一点,但是它带来的好处与第一个版本的代码完全相同,而且比使用QString::fromLatin1()转换Latin-1字符串要快。由于QString有QString(QLatin1String)这个构造函数,QLatin1String可以在任何需要QString的地方使用。比如:

QLabel *label = new QLabel(QLatin1String("MOD"), this);

注意:

  1. 如果我们调用的函数重载了支持QLatin1String类型的参数,避免了QLatin1String隐式转换成QString,那么使用QLatin1String比QStringLiteral更加高效。比如:
	if (attribute.name() == QLatin1String("http-contents-length")) //...
  1. 如果使用的函数并没有重载支持QLatin1String类型的参数,那么QLatin1String对QString的隐式转换将涉及到内存分配。在这些情况下,使用QStringLiteral更好。
  2. 有些编译器在编译除了US-ASCII 编码以外的字符串时可能会存在bug,此时我们要在字符串前加上u。它是可选的。

猜你喜欢

转载自blog.csdn.net/a844651990/article/details/84851753
今日推荐