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

news2025/1/17 0:19:14

【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测试一下,你会发现三个所需时间的差别是非常大的。

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

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

点赞!点赞!点赞!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1682761.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【kubernetes】多 master 高可用集群架构部署

目录 前言 一、环境部署 二、master02 节点部署 1、拷贝相关文件 2、修改配置文件 3、启动各服务并设置开机自启 4、 查看node节点状态 三、负载均衡部署 1、部署 nginx 服务 1.1 编译安装 nginx 1.2 修改 nginx 配置文件 2、部署 keepalived 服务 2.1 yum安装 ke…

笔记88:LeetCode_134_加油站

前言: 前言1:这个题的题目条件给的不太严谨,题目描述中说“如果存在解,则保证它是唯一的”,通过我的实践,我发现这句话的意思其实是本题的所有样例只有两种情况,无解/有唯一解;而不可…

医院是自建档案室还是档案寄存好呢

医院可以选择自建档案室或档案寄存,具体选择取决于医院的需求和资源。 自建档案室意味着医院会拥有自己的档案空间和设施,可以更方便地管理和保管档案。这种方式可以确保医院对档案的访问和控制有更多的自主权,同时也能够根据医院的需求进行档…

5月23日学习记录

[CSAWQual 2019]Unagi 涉及:xxe漏洞,外来编码xml绕过 打开环境,发现存在文件上传 简单上传一个php 毫无疑问上传失败,说是存在waf,绕过waf才能上传,点击here看看 xml编码,可能存在xxe漏洞&…

Java并发: 锁和同步

在Java并发: 面临的挑战那一篇中我们提到锁和同步是实现并发安全(可见性/原子性)的方法之一。这一章我们来讲讲Java中的锁和同步的各种工具,包括: LockSupportAbstractQueuedSynchronizerJava内置的锁实现 1. LockSupport LockSupport是基于Unsafe的park/unpark实…

57. UE5 RPG 处理AI敌人转向以及拾取物品的问题

在上一篇文章中,我们实现了使用AI行为树控制敌人进行移动,它们可以一直跟随玩家,虽然现在还未实现攻击。但在移动过程中,我发现了有两个问题,第一个是敌人转向的时候很僵硬,可以说是瞬间转向的,…

鸿蒙开发接口应用程序包管理:【ApplicationInfo】

ApplicationInfo 说明: 本模块首批接口从API version 7 开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。 开发前请熟悉鸿蒙开发指导文档: gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…

vue3结合element-plus之如何优雅的使用表单组件

背景 在日常开发中,我们会经常使用 element-ui 或者是 antdesign 或者是 element-plus 等组件库实现搜索功能 这里就需要用到相关表单组件 下面就以 element-plus 为例,我们实现一个搜索功能的组件,并且随着屏幕尺寸的变化,其布局也会跟随变化 最终大致效果如下: 这里…

MySQL之Schema与数据类型优化(三)

Schema与数据类型优化 BLOB和TEXT类型 BLOB和TEXT都是为存储很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。 实际上它们分别属于两组不同的数据类型家族:字符类型是TINYTEXT,SMALLTEXT,TEXT,MEDIUMTEXT,LONG…

成都爱尔周进院长提醒当双眼度数差距过大,我们该做些什么

每个人的用眼方式、用眼习惯且两只眼睛“天生条件”不一定相同,当发生近视,双眼近视程度也就可能不同,双眼度数必然会变得不一样。当双眼度数产生差异,尤其是当双眼度数差别过大时会引发哪些问题? 双眼度数不一致&…

Qt快速入门到熟练(电子相册项目(二))

上一节我们成功实现了创建项目的向导界面的开发,这节我们继续去实现电子相册的其他功能。 新建DirTreeWidget类 还记得在Qt快速入门到熟练(电子相册项目(一))-CSDN博客里面,我们是在QDockWidget中添加了一个treeWidget作为以后显示目录树的空间…

OpenHarmony集成OCR三方库实现文字提取

1. 简介 Tesseract(Apache 2.0 License)是一个可以进行图像OCR识别的C库,可以跨平台运行 。本样例基于Tesseract库进行适配,使其可以运行在OpenAtom OpenHarmony(以下简称“OpenHarmony”)上,并新增N-API接口供上层应…

[算法] 优先算法(二): 双指针算法(下)

🌸个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 🏵️热门专栏:🍕 Collection与数据结构 (91平均质量分)https://blog.csdn.net/2301_80050796/category_12621348.html?spm1001.2014.3001.5482 🧀Java …

Rust学习心得

我分享一下一年的Rust学习经历,从书到代码都一网打尽。 关于新手如何学习Rust,我之前在Hacker News上看到了这么一篇教程: 这篇教程与其他教程不同的时,他不是一个速成教程,而是通过自己的学习经历,向需要…

mac安装两个版本谷歌浏览器;在mac运行不同版本的chrome浏览器

场景 正常情况下,mac上只能安装一个版本的chrome浏览器,即使你安装了两个版本的,打开老旧版本时候也会自动切换成最新版的浏览器 故本文主要解决如何下载和在mac运行不同版本的chrome浏览器 文章目录 场景一、下载1.mac本身就有一个最新版ch…

【MySQL】库的操作和表的操作

库的操作和表的操作 一、库的操作1、创建数据库(create)2、字符集和校验规则(1)查看系统默认字符集以及校验规则(2)查看数据库支持的字符集(3)查看数据库支持的字符集校验规则(4)校验…

网关路由SpringCloudGateway、nacos配置管理(热更新、动态路由)

文章目录 前言一、网关路由二、SpringCloudGateway1. 路由过滤2. 网关登录校验2.1 鉴权2.2 网关过滤器2.3 登录校验2.3.1 JWT2.3.2 登录校验过滤器 3. 微服务从网关获取用户4. 微服务之间用户信息传递 三、nacos配置管理问题引入3.1 配置共享3.1.1 在Nacos中添加共享配置3.1.2 …

Kubectl 的使用——k8s陈述式资源管理

一、kebuctl简介: kubectl 是官方的CLI命令行工具,用于与 apiserver 进行通信,将用户在命令行输入的命令,组织并转化为 apiserver 能识别的信息,进而实现管理 k8s 各种资源的一种有效途径。 对资源的增、删、查操作比较方便&…

MobaXterm下载虚拟机SSH链接超时解决(保姆级踩坑)

文章目录 为啥要用MobaXtermMobaXterm下载打开虚拟机ssh链接ssh连接失败排查linux配置windows配置 到这了,什么都干了,怎么还不成功? 更多相关内容可查看 在一个阳光明媚的下午,开启了无限踩坑的旅程 为啥要用MobaXterm 作为小编…

高性能负载均衡的分类及架构分析

如何选择与部署适合的高性能负载均衡方案? 当单服务器性能无法满足需求,高性能集群便成为提升系统处理能力的关键。其核心在于通过增加服务器数量,强化整体计算能力。而集群设计的挑战在于任务分配,因为无论在哪台服务器上执行&am…