QString、QLatin1String、QStringLiteral区别和用法以及效率

news2024/11/27 22:32:37

QString类

QString是Qt框架中提供的字符串类,用于处理Unicode字符串。它提供了许多方便的方法和功能,可以进行字符串的连接、查找、替换、截取等操作。QString类的对象是可变的,可以在运行时修改字符串内容。
.
由以上引出一个知识点:Unicode字符集
Unicode字符集是一个全球通用的字符编码标准,旨在覆盖世界上所有的字符。它提供了一个唯一的字符代码点,用于表示各种语言、符号、标点符号、表情符号和特殊字符。

Unicode字符集采用了固定长度的编码方案,其中最常用的是UTF-8、UTF-16和UTF-32。UTF-8是一种变长编码,用1到4个字节表示字符;UTF-16是一种定长或变长编码,用2或4个字节表示字符;UTF-32是一种定长编码,用4个字节表示字符。

Unicode字符集目前包含超过137,000个字符,覆盖了几乎所有的书写系统,包括各种语言、数学符号、货币符号、箭头、表情符号、图形符号等等。它还为每个字符提供了唯一的码点值,通常用前缀U+表示,后面跟着字符的十六进制表示。

例如,拉丁字母大写的字母"A"在Unicode字符集中的码点是U+0041,中文汉字"爱"的码点是U+7231。通过使用Unicode字符集,可以在不同的平台和程序之间共享和交换文本数据,确保字符的正确显示和处理。

QLatin1String类

QLatin1String是Qt框架中提供的常量字符串类,用于处理Latin1编码的字符串。它提供了一些特定于Latin1编码的优化,适用于只读的字符串操作。QLatin1String实际上是QString类的一个封装,可以有效地处理Latin1编码的字符串。
.
由以上引出一个知识点:Latin1编码
Latin1编码,也称为ISO-8859-1编码,是一种字符编码标准,用于表示拉丁字母的字母和符号。它是ISO/IEC 8859系列中的第一个标准,包含了西欧语言字符集。每个字符占用一个字节(8位),可以表示256个不同的字符。

Latin1编码覆盖了美国英语、西班牙语、葡萄牙语、法语、德语、意大利语、荷兰语、瑞典语、挪威语、丹麦语等大部分欧洲语言字符。

在使用Latin1编码时,每个字符都有一个唯一的字节值,例如字母’A’的字节值是65,字母’a’的字节值是97,依此类推。

尽管Latin1编码被广泛使用,但它无法表示其他非拉丁字母字符,比如中文、日文或俄文等字符。为了解决这个问题,Unicode编码应运而生,它通过使用更多的字节位来表示更多的字符。

QStringLiteral宏

QStringLiteral是C++11中引入的编译时字符串字面量,用于在编译时创建QString对象。QStringLiteral可以实现更高效的字符串操作,因为它会在编译时将字符串转换为QString对象,避免了运行时的字符串拷贝和内存分配。

示例:展示效率

{
        QString str = "helloworld";
        int i = 0;
        int nCount = 0;
        QElapsedTimer timer;
        timer.start();
        while (i < 1000000) {
            if(str == QString("helloworld") )
            {
                ++nCount;
            }
            ++i;
        }
        qDebug().noquote() << __FILE__ << __LINE__ << "QString 比较耗时:" << timer.elapsed();
    }

    {
        QString str = "helloworld";
        int i = 0;
        int nCount = 0;
        QElapsedTimer timer;
        timer.start();
        while (i < 1000000) {
            if(str == QLatin1String("helloworld") )
            {
                ++nCount;
            }
            ++i;
        }
        qDebug().noquote() << __FILE__ << __LINE__ << "QLatin1String 比较耗时:" << timer.elapsed();
    }

    {
        QString str = "helloworld";
        int i = 0;
        int nCount = 0;
        QElapsedTimer timer;
        timer.start();
        while (i < 1000000) {
            if(str == QStringLiteral("helloworld") )
            {
                ++nCount;
            }
            ++i;
        }
        qDebug().noquote() << __FILE__ << __LINE__ << "QStringLiteral 比较耗时:" << timer.elapsed();
    }

结果输出

..\untitled16\mainwindow.cpp 26 QString 比较耗时: 437
..\untitled16\mainwindow.cpp 42 QLatin1String 比较耗时: 119
..\untitled16\mainwindow.cpp 58 QStringLiteral 比较耗时: 397

在这里插入图片描述

三者效率

在效率方面,QStringLiteral相对于QString在创建对象和内存分配方面更高效。
而QLatin1String(以及char*)在处理Latin1编码的字符串时可能更有效率,因为它们不涉及Unicode字符的转换和处理。

结论

综上所述,如果需要处理Unicode字符串或需要字符串的可变性,并且不需要关注字符串编码和内存管理,推荐使用QString。如果需要处理Latin1编码的常量字符串,并且希望获取更高的效率,可以考虑使用QLatin1String。而如果在编译时已知字符串内容,并且追求最高的效率,可以使用QStringLiteral。

①参数能使用const char*类型或QLatin1String类型的地方使用相应的参数。
.
②参数需要QString参数类型的地方,若值不修改,则使用QStringLiteral宏
.
③参数需要QString类型且QString可能被修改,则直接使用QString或隐式转换。

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

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

相关文章

LabVIEW(一)简介

LabVIEW&#xff08;Laboratory Virtual Instrument Engineering Workbench&#xff09;是一种程序开发环境&#xff0c;是由美国国家仪器&#xff08;NI&#xff09;公司研制开发的。LabVIEW与其他计算机语言的显著区别是&#xff1a;其他计算机语言都是采用基于文本的语言产生…

linux驱动开发找不到工作寻求前辈建议?

linux驱动开发找不到工作寻求前辈建议? 不要局限驱动&#xff0c;我毕业的时候不成熟的想法就是做驱动比做应用有技术含量&#xff0c;就努力往这方面做&#xff0c;我就从应用转到驱动最近很多小伙伴找我&#xff0c;说想要一些Linux内核学习资料&#xff0c;然后我根据自己从…

产品经理必备知识——API接口

前言 在古代&#xff0c;我们的传输信息的方式有很多&#xff0c;比如写信、飞鸽传书&#xff0c;以及在战争中使用的烽烟&#xff0c;才有了著名的烽火戏诸侯&#xff0c;但这些方式传输信息的效率终究还是无法满足高速发展的社会需要。如今万物互联的时代&#xff0c;我通过…

嵌入式养成计划-36----C++引用--const--函数重载--结构体--类

八十、 引用 80.1 概念 引用是给目标取了个别名。引用与目标&#xff0c;它俩的地址一样 80.2 格式 数据类型 &引用名 同类型的变量名&#xff1b;数据类型 &引用名 同类型的变量名&#xff1b; eg&#xff1a;int a;int &b a; //b引用a,给a取个别名叫b80.3…

ps安装遇到问题

安装PhotoShop报错 无法写入注册表值请检查权限(错误代码160)_ps安装无法写入注册表值错误160_Zhac的博客-CSDN博客在Visual Studio中创建DLL项目 打开VS 新建一个项目&#xff1a;文件→→新建→→项目 选择Visual C#类库(.NET Framework)Unity当前只支持最高 3.5版本将UnityE…

MySQL增删查改(进阶1)

一、数据库约束 约束&#xff1a;按照一定条件进行规范的做事&#xff1b; 表定义的时候&#xff0c;某些字段保存的数据需要按照一定的约束条件&#xff1b; 1.null约束 字段null&#xff1a;该字段可以为空&#xff1b;not null&#xff1a;该字段不能为空不指定的话就是…

Bigemap是如何在生态林业科技行业去应用的

选择Bigemap的原因&#xff1a; ①之前一直是使用的谷歌地球&#xff0c;现在谷歌不能使用了就在网上搜索找一款可以替代的软件&#xff0c;工作使用需求还是挺大的&#xff0c;谷歌不能用对工作进展也非常影响&#xff0c;在网上搜索到软件大部分功能都可以满足需求 ②软件卫…

小白自学—网络安全(黑客技术)笔记

目录 一、自学网络安全学习的误区和陷阱 二、学习网络安全的一些前期准备 三、网络安全学习路线 四、学习资料的推荐 想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类…

Unity Golang教程-Shader编写一个流动的云效果

创建目录 一个友好的项目&#xff0c;项目目录结构是很重要的。我们先导入一个登录界面模型资源。 我们先创建Art表示是美术类的资源&#xff0c;资源是模型创建Model文件夹&#xff0c;由于是在登录界面所以创建Login文件夹&#xff0c;下面依次是模型对应的资源&#xff0c…

3D 生成重建004-DreamFusion and SJC :TEXT-TO-3D USING 2D DIFFUSION

3D 生成重建004-DreamFusion and SJC &#xff1a;TEXT-TO-3D USING 2D DIFFUSION 文章目录 0 论文工作1 论文方法1.1论文方法1.2 CFG1.3影响1.4 SJC 2 效果 0 论文工作 对于生成任务&#xff0c;我们是需要有一个数据样本&#xff0c;让模型去学习数据分布 p ( x ) p(x) p(x…

如何查看端口占用(windows,linux,mac)

如何查看端口占用&#xff0c;各平台 一、背景 如何查看端口占用&#xff1f;网上很多&#xff0c;但大多直接丢出命令&#xff0c;没有任何解释关于如何查看命令的输出 所谓 “查端口占用”&#xff0c;即查看某个端口是否被某个程序占用&#xff0c;如果有&#xff0c;被哪…

HDLbits: Shift18

先补充一下算术移位寄存器和按位移位寄存器&#xff1a; SystemVerilog具有按位和算术移位运算符。 按位移位只是将向量的位向右或向左移动指定的次数&#xff0c;移出向量的位丢失。移入的新位是零填充的。例如&#xff0c;操作8’b11000101 << 2将产生值8’b00010100…

【LeetCode高频SQL50题-基础版】打卡第3天:第16~20题

文章目录 【LeetCode高频SQL50题-基础版】打卡第3天&#xff1a;第16~20题⛅前言 平均售价&#x1f512;题目&#x1f511;题解 项目员工I&#x1f512;题目&#x1f511;题解 各赛事的用户注册率&#x1f512;题目&#x1f511;题解 查询结果的质量和占比&#x1f512;题目&am…

拆解CPU的基本结构和运行原理

CPU的基本结构 CPU是一个计算系统的核心 南北桥芯片将CPU与外设连接起来 CPU执行流程 CPU的电路基础 组合电路基本原理 时序电路基本原理 多核成为主流 汇编语言和寄存器 中断的基本原理 中断的产生 中断服务程序 CPU 做为计算机的总司令官&#xff0c;它管理着计算…

NEFU数字图像处理(2)图像增强

一、背景 图像在传输或处理过程中会引入噪声或使图像变模糊&#xff0c;从而降低了图像质量&#xff0c;甚至淹没了特征给分析带来困难&#xff0c;因此要增强特征&#xff0c;进行处理 图像增强按特定的需要突出一幅图像中的某些信息同时&#xff0c;削弱或去除某些不需要的信…

一文带你了解IAM(身份与访问管理)

一文带你了解IAM&#xff08;身份与访问管理&#xff09; 在进入新公司时&#xff0c;领导说让我们改版之后采用IAM的方式进行资源管理&#xff0c;what&#xff1f;IAM是什么&#xff1f;恕我无知了。后来查阅了相关资料才知道。 IAM不仅是一种产品&#xff0c;也是大部分产品…

NewStarCTF 2023 WEEK1|PWN ret2text

拖进IDA&#xff0c;查看 int __cdecl main(int argc, const char **argv, const char **envp) {char buf[32]; // [rsp0h] [rbp-20h] BYREFinit();puts("Welcome to NewStar CTF!!");puts("Show me your magic");read(0, buf, 0x100uLL);return 0; } ma…

Golang 程序漏洞检测利器 govulncheck(三):github 集成方法

上一篇文章详细介绍了 Golang 程序漏洞扫描工具 govulncheck 使用的漏洞数据库&#xff08;Go vulnerability database&#xff09;&#xff0c;本文详细讲解下 Github 项目如何使用 govulncheck。 govulncheck 为 Golang 开发者提供了一种准确可靠的方式来了解程序中可能存在…

matlab高斯消元法求逆

算法实现基本与高斯消元法求解线性方程组相同&#xff0c;同样还是三层循环进行消元和回代&#xff0c;只是增广矩阵的规模由nn1变成了n2n&#xff0c;因此算法复杂度仍然为O(n3)。 A[1,1,2,1;1,2,0,1;1,4,2,1;1,8,2,4]; beye(4); A_b[A,b]; [n,m]size(A_b); for i1:nfor jm:-…

零基础,想做一名网络安全工程师,我可以去哪里学,或者有什么建议?

这应该是全网最全的网络安全扫盲帖了&#xff01;发CSDN也有一段时间了&#xff0c;经常会有朋友在后台问我各种问题&#xff0c;比如“应该如何选方向”、“网络安全前景如何”、“怎么选适合的安全岗位”等等。于是今天借这个问题来给大家好好说说&#xff0c;如果你是零基础…