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


    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();
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    结果输出

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

    在这里插入图片描述

    三者效率

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

    结论

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

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

  • 相关阅读:
    没有 accept,建立 TCP 连接,可以吗?
    浅析搭建视频监控汇聚平台的必要性及场景应用
    使用接口包装器模块简化在FPGA上实现PCIe的过程
    【从零开始学习 UVM】2.3、UVM 基础功能 —— UVM Object Copy/Clone
    学习笔记:机器学习之支持向量机(二)
    C语言利用函数创建链表,修改链表(插入,删除,添加),指针函数的返回
    从零开始学习SLAM
    SpringCloud-1-微服务介绍
    基于GoFrame+Vue+ElementUI企业级 Go 应用开发框架
    arr.sort
  • 原文地址:https://blog.csdn.net/MrHHHHHH/article/details/133689713