【Qt问题】QStringLiteral、QString、QLatin1String简单区分

【Qt问题】QStringLiteral、QString、QLatin1String简单区分

最近在看项目代码的时候,一个频繁使用的关键词——“QStringLiteral”,引起了我的注意,关键是我竟然对它非常模糊,这不是一个Qter能够轻易接受的事情。

于是我秉承着活到老学到老的学习态度,坚定选择了在上班时间来搞懂这个知识点(ps:绝对不是为了摸鱼!)

下面我们一个个看:

一、QString

1、概念

QString是Qt中用于表示Unicode字符串的类。它是Qt中最常用的字符串类之一,提供了丰富的字符串操作方法和功能。QString类支持Unicode字符集,可以存储任意Unicode字符,包括中文、日文、韩文等多种语言的字符。

QString类提供了丰富的构造函数、操作符和方法,可以方便地进行字符串的拼接、查找、替换、大小写转换、格式化等操作。此外,QString还支持与标准C++字符串类std::string之间的转换,可以通过toStdString()fromStdString()方法进行相互转换。

2、示例

 // hasAttribute函数接受一个类型为QString的参数
  if (node.hasAttribute("http-contents-length")) //...

此时会产生一个QString的临时对象,该临时对象作为参数传递给hasAttribute函数。这是非常昂贵的、效率非常低的操作。因为它涉及到内存分配、拷贝、转换字符串字面常量数据到QString内部编码等工作。 

二、QStringLiteral

1、概念

QStringLiteral是Qt提供的一个宏,用于创建编译时常量的QString。产生的字符串数据存放在编译对象文件的只读片区。

它的主要作用是在编译时将字符串转换为QString对象,而不是在运行时进行转换,这样可以提高程序的性能和效率。

2、示例

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

在这种情况下,QString内部数据将会在编译时期产生,而不是在每次运行时进行字符字面常量内存分配、字符字面量向QString对象的转换。

用QStringLiteral代替用双引号括起来的普通C++字符串字面常量,能够明显地提高从字符串字面常量创建QString对象实例的效率,且创建QString对象实例是在编译时进行的。

三、 QLatin1String

1、概念

QLatin1String是Qt中的一个类,用于表示一个Latin-1编码的字符串字面值。Latin-1编码是ISO/IEC8859-1编码的一种,它可以表示大多数西欧语言中使用的字符。QLatin1String类提供了一种在不进行字符集转换的情况下处理Latin-1编码字符串的方式,这可以提高性能并避免不必要的字符串拷贝。

QLatin1String的构造函数接受一个Latin-1编码的字符串字面值作为参数,然后可以通过该对象提供的方法来访问和操作这个字符串。使用QLatin1String可以避免将 Latin-1 编码的字符串隐式转换为 UTF-16 编码的 QString对象,从而提高效率。

2、示例

 if (attribute.name() == QLatin1String("http-contents-length"))

此时可以直接比较QLatin1String,这比比QStringLiteral高效,因为它避免了转为QString。

注意:如果要使用QLatin1String,一定要保证被调用函数重载了QLatin1String参数的 

如果用QLatin1String作为实参传给被调用函数,而被调用函数实际没有重载QLatin1String参数,即该函数的形参不是QLatin1String类型,这将导致隐式类型转换到QString,从而触发内存分配,这并不是我们希望的。

2.1示例:

void fun(const QString& str)
{
   // 其它代码
}

此时就优先采用fun(QStringLiteral("csdn"); 

而如果是重载QLatin1String参数

void fun(const QLatin1String& str)
{
   // 其它代码
}

此时就优先采用fun(QLatin1String("csdn"); 


好了,以上就是关于QStringLiteral、QString、QLatin1String的简单区分,希望大家看了以后,不再只局限于使用QString。大家如果有时间,可以写一个demo测试一下,你会发现三个所需时间的差别是非常大的。

都看到这里了,点个赞再走呗朋友~

加油吧,预祝大家变得更强!

点赞!点赞!点赞!

  • 9
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值