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

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

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

点赞!点赞!点赞!

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

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

相关文章

前端学习-day08

文章目录 01-相对定位02-绝对定位03-绝对定位居中04-固定定位05-堆叠顺序06-CSS精灵-基本使用07-案例-京东服务08-字体图标10.垂直对齐方式11-过度12-透明度13-光标类型14-轮播图 01-相对定位 <!DOCTYPE html> <html lang"en"> <head><meta ch…

动态规划(算法)---01.斐波那契数列模型_第N个泰波那契数

前言&#xff1a; 有一个很著名的公式 “程序数据结构算法”。 算法是模型分析的一组可行的&#xff0c;确定的&#xff0c;有穷的规则。通俗的说&#xff0c;算法也可以理解为一个解题步骤&#xff0c;有一些基本运算和规定的顺序构成。但是从计算机程序设计的角度看&#xff…

【C++】牛客 ——NC138 矩阵最长递增路径

✨题目链接&#xff1a; NC138 矩阵最长递增路径 ✨题目描述 给定一个 n 行 m 列矩阵 matrix &#xff0c;矩阵内所有数均为非负整数。 你需要在矩阵中找到一条最长路径&#xff0c;使这条路径上的元素是递增的。并输出这条最长路径的长度。 这个路径必须满足以下条件&#…

Django项目从创建到开发以及数据库连接的主要步骤,精简实用

1、项目创建 安装命令&#xff1a;pip install django3 -i <https://pypi.tuna.tsinghua.edu.cn/simple>上述命令是使用清华镜像&#xff0c;安装django3在项目的创建目录执行命令&#xff1a;django-admin startproject 项目名称&#xff08;英文&#xff09;就可以在指…

ubuntu18 安装sudo

ubuntu18 安装sudo 在Ubuntu 18.04上安装sudo通常是不必要的&#xff0c;因为sudo是Ubuntu及其衍生版本的基本包之一&#xff0c;默认情况下就已经安装。如果出于某种原因&#xff0c;sudo没有预装或者你需要升级到最新版本&#xff0c;你可以通过以下命令安装或更新它&#x…

【STM32项目】基于stm32智能鱼缸控制系统的设计与实现(完整工程资料源码)

实物演示效果 基于stm32智能鱼缸控制系统的设计与实现 目录&#xff1a; 实物演示效果 目录&#xff1a; 一、 绪论 1.1 项目研究目的及意义 1.1.1 选题目的 1.1.2 选题意义 1.2 国内外研究现状 1.2.1 国外发展现状 1.2.2 国内发展现状 1.3 项目研究内容 二、智能鱼缸系统总体设…

一文读懂Linux

前言 为了便于理解&#xff0c;本文从常用操作和概念开始讲起。虽然已经尽量做到简化&#xff0c;但是涉及到的内容还是有点多。在面试中&#xff0c;Linux 知识点相对于网络和操作系统等知识点而言不是那么重要&#xff0c;只需要重点掌握一些原理和命令即可。为了方便大家准…

2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新

v1.1.0更新 v1.1.0更新 2024年5月19日优雅草蜻蜓K知识付费系统旗舰版v1.0.9进度更新&#xff0c;首页体育栏目完善新增用户发布页面 开发进度 首页体育栏目完善 新增用户发布页面 新增用户登录完善 新增学习课程页面完善-过往课程数据完成 去掉其他三方登录&#xff0c;新增…

团队代码质量利器:ESLint 搭配 Prettier

一个中大型项目&#xff0c;一般由团队成员共同开发维护。但每个开发人员都有独特的代码编写风格和不同的文本编辑器。那么如何解决同一项目中有太多不同编码风格的问题&#xff1f;如何实现相同的编码风格&#xff0c;避免团队成员之间的许多警告呢&#xff1f; 答案就是&…

Web Accessibility基础:构建无障碍的前端应用

Web Accessibility&#xff08;网络无障碍&#xff09;是确保所有人都能平等访问和使用网站和应用程序的关键。这包括视觉、听觉、运动和认知能力有限的用户。以下是一些构建无障碍前端应用的基础原则和代码示例&#xff1a; 2500G计算机入门到高级架构师开发资料超级大礼包免…

list stream 改变list属性的值

在Java中&#xff0c;如果你想使用Stream API来改变List中对象的某个属性值&#xff0c;需要注意的是&#xff0c;Stream API本身设计为不可变操作&#xff0c;即它不直接修改原有的集合&#xff0c;而是产生一个新的流或集合。但是&#xff0c;你可以通过流操作来创建一个新的…

java文档管理系统的设计与实现源码(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的文档管理系统的设计与实现。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 文档管理系统的…

第二证券今日投资参考:5月国产游戏版号发放 猪价加速上涨

昨日&#xff0c;两市股指盘中震荡上扬&#xff0c;沪指盘中续创年内新高&#xff0c;创业板指一度涨超1%。到收盘&#xff0c;沪指涨0.54%报3171.15点&#xff0c;深证成指涨0.43%报9750.82点&#xff0c;创业板指涨0.59%报1875.93点&#xff0c;上证50指数涨0.34%&#xff1b…

小程序-收货地址管理模块实现

页面结构代码&#xff1a; address-form.vue --->新建地址和修改地址页面 <template><view class"content"><form><!-- 表单内容 --><view class"form-item"><text class"label">收货人</text>…

注册/认证小程序为什么验证失败

​很多商家在注册/认证小程序时&#xff0c;经常会出现各种验证失败的情况。其中可能是工商总局数据没更新&#xff0c;也有可能是商家填写的信息有误。下面具体分析一下这些情况。 一、工商数据没有更新或存在异常。 微信平台是直接拉取国家工商总局的数据&#xff0c;工商数…

Python 中文编码问题

Python 输出 "Hello, World!"&#xff0c;英文没有问题&#xff0c;但是如果你输出中文字符 "你好&#xff0c;中国" 就有可能会碰到中文编码问题。 Python 文件中如果未指定编码&#xff0c;在执行过程会出现报错&#xff1a; print ("你好&#x…

登录安全分析报告:创蓝云智注册

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

vue 组件中 data 为什么必须是函数

在 Vue 中&#xff0c;组件的 data 必须是一个函数而不是一个对象&#xff0c;这是因为 Vue 组件是可复用的&#xff0c;并且每个组件实例都需要拥有自己独立的数据状态。如果 data 是一个对象&#xff0c;那么这个对象在多个组件实例之间将是共享的&#xff0c;这会导致所有的…

# 分布式链路追踪_skywalking_学习(1)

分布式链路追踪_skywalking_学习&#xff08;1&#xff09; 一、APM 系统概述 1、什么是 APM 系统&#xff1f; APM &#xff1a;全称 Application Performance Management 即应用性能管理系统。是对企业系统即时监控以实现对应用程序性能管理和故障管理的系统化的解决方案。…

移动端常用meta

在移动端开发中&#xff0c;<meta> 标签用于提供关于HTML文档的元数据&#xff0c;这些元数据不会显示在页面上&#xff0c;但可以被浏览器解析&#xff0c;用于控制页面的行为和外观。以下是一些在移动端开发中常用的 标签&#xff1a; 1. 视口设置 这是移动端开发中最…