欢迎访问Ningto's博客

Menu
  • 首页
  • 归档
  • 关于
  • 书签
  • 必应壁纸
  • IT聚合
  • 工具
    • 我的工具列表
    • 我的网盘
    • 必应每日壁纸API
    • Html转Markdown
    • 仙尘光标
Menu

隐式共享的QJsonArray对象,非const遍历会导致一次内存拷贝

最后更新 2021-11-17 12:49:18   阅读量 1124

隐式共享的QJsonArray对象,非const遍历会导致一次内存拷贝

直接看一个例子,先初始化一个大的arr,然后将其赋值给arr2和arr3,此时我们观察对象的d指针所指向的内存。 arr2和arr指向的内存是一致的,arr3和obj["arr"]指向的内存是一致的,所以arr2和arr3都是隐式共享的对象。

对于隐式共享的对象如果要修改的时候会拷贝一份数据,所以对于非const遍历隐式共享的数组会造成一次拷贝,非隐式共享对象没有这个问题。

所以,对比const和非const遍历,arr都不会造成拷贝; arr2和arr3非const遍历时会造成内存拷贝,可以观察遍历前和遍历后的d指针。

对于不需要修改的数据我们应该尽可能的去使用const遍历。

        qDebug() << "1";
        QJsonObject obj;
        QJsonArray arr;
        for (int i = 0; i < 100000; i++) {
            QJsonObject obj;
            obj["text"] = "11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111";
            arr.append(obj);
        }
        obj["arr"] = arr;
        QJsonArray arr2 = arr;
        QJsonArray arr3 = obj["arr"].toArray();
        qDebug() << "2";
        for (QJsonArray::const_iterator itor = arr.constBegin(); itor != arr.constEnd(); ++itor) {
            const QJsonObject &in = itor->toObject();
            QString vvv = getValue(in, "text").toString();
        }

        qDebug() << "3";
        for (QJsonArray::const_iterator itor = arr.begin(); itor != arr.end(); ++itor) {
            const QJsonObject &in = itor->toObject();
            QString vvv = getValue(in, "text").toString();
        }
        qDebug() << "4";
(转载本站文章请注明作者和出处:泞途 - ningto.com)

下一篇 – visual studio修改堆栈保留大小和提交大小
上一篇 – beast websocket demo

  1. Qt

toningto@outlook.com

标签云

Life Android Javascript Python Windows Product Go Tools Java MQ Qt Node.js Tips Shell Design MongoDB Others Mac Mobile React C/C++ Web Boost Linux IOS Bug Database

推广链接

【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

多谢支持,用了好几年,服务很稳定支持多设备!

其他

文章RSS

Copyright © 2016 Welcome To Ningto Blog | 鄂ICP备17003086号-2