首页 > 编程语言 >QT/c++相关记录

QT/c++相关记录

时间:2024-10-18 17:31:48浏览次数:1  
标签:obj1 QJsonObject obj2 QT 记录 c++ 共享 数据 堆上

 

QT的大部分容器类(如 QStringQVector 等)都是使用 隐式共享(implicit sharing) 技术,这是通过写时复制(copy-on-write, COW)实现的优化模式。理解这一点的关键在于,Qt 的容器类需要在对象拷贝时高效处理数据,而 隐式共享 则允许在栈上操作容器的同时,在需要时共享内部数据的堆上存储。以QJsonObject(其实际也可以视为一个轻量级容器)为例:

当直接在栈上创建一个QJsonObject,即QJsonObject obj;这个对象本身(包括一些元数据,如指向实际数据的指针、引用计数等)是在栈上分配的。如果对象超出了它的作用域(例如函数结束时),它在栈上被销毁。QJsonObject 的实际数据(如存储键值对的哈希表)则是在堆上分配的。这是为了支持动态分配的灵活性,尤其是当 JSON 数据量比较大或需要频繁扩展时,堆上存储更适合。多个 QJsonObject 可以共享同一个堆上的数据,直到其中某个对象尝试修改数据时,才会触发写时复制。

通过这种机制,多个 QJsonObject 可以指向同一份堆上的数据。当多个对象指向相同的数据时,它们共享这一份数据,不需要额外的内存开销。例如:

QJsonObject obj1;
obj1["key"] = "value";  // 堆上分配存储空间

QJsonObject obj2 = obj1;  // 只是拷贝了指针,obj2 和 obj1 共享堆上的数据

此时 obj1obj2 指向同一个堆上的键值对数据。这种共享机制避免了不必要的深拷贝,提升了性能。

当需要修改数据时,Qt 采取了写时复制的策略,即当某一个对象试图写入数据(修改键值对),才会分离出该对象的专属数据副本。这时,真正的深拷贝会发生。

obj2["key"] = "new_value";  // 由于 obj2 修改了数据,它不再共享 obj1 的数据

此时,obj2 会分配新的堆内存,存储修改后的数据,而 obj1 仍然指向原始数据。

 

标签:obj1,QJsonObject,obj2,QT,记录,c++,共享,数据,堆上
From: https://www.cnblogs.com/Explosion556/p/18474740

相关文章

  • 必学的简单排序算法——选择排序(c++)
    标题前言一、什么是选择排序二、算法图解三、经典例题1、颜色分类题解思路代码题解2、至少是其他数字两倍的最大数解题思路代码题解3、寻找两个正序数组的中位数解题思路代码题解前言排序算法虽然简单,但是我也要掌握熟练应用,因为学习算法这个复杂的过程,我们应该......
  • MSP430学习记录(1)一种简便的MSP430Ware安装方法
    目前在学习MSP430,用的具体型号是MSP430FR2476。现在是刚起步,以前从来没有学过,希望自己能够快速上手。---------------------------分割线---------------------------今天主要是安装了一下CCS,用的是11版本。看网上说是在TI官网下载例程,找倒是很好找,但是不好下载...为啥呢?它......
  • C++ -string -常见用法2
    博客主页:【夜泉_ly】本文专栏:【C++】欢迎点赞......
  • C++ 基础-面试题01(C和C++区别、C结构体和C++结构体区别、C和C++ static区别、a和&a区
    1.C和C++的区别特性CC++编程范式面向过程编程面向对象编程+面向过程编程+泛型编程类和对象不支持类和对象支持类和对象,封装、继承、多态等特性标准库标准库有限,如stdio.h、stdlib.h丰富的标准库,如STL(容器、算法)函数和运算符重载不支持支持内存管理手动管理,使用malloc......
  • C++ 基础-面试题02(final和override关键字、sizeof和strlen区别、strcpy、sprintf 与me
    1.final和override关键字在C++中,final和override关键字是在面向对象编程中用于处理类的继承和多态的。它们主要用于管理派生类和虚函数,提供额外的安全性和代码可读性,防止意外的函数重写或错误的重载行为。1.final关键字final关键字用于防止进一步的继承或函数重......
  • Codeforces Round 892 (Div. 2)题解记录
    题目链接:https://codeforces.com/contest/1859A.UnitedWeStand选最大的数即可注意题目输出格式 #include<iostream> #include<string.h> #include<map> #include<vector> #include<set> #include<unordered_set> #include<stack> #incl......
  • 如何删除电脑中FTP保存的密码和历史记录
    windows登录FTP的用户名密码保存在注册表里。 具体位置HKEY_CURRENT_USER\Software\Microsoft\FTP\Accounts。 在Accounts里面子项,名称就是你的FTP地址,一、清除登录框里的用户名记录的方法:        1、开始-》运行-》regedit;        2、找到HKEY_CURRENT_U......
  • 零基础学习C++(4.注释)
    注释#include<iostream>intmain(){ //这是单行注释 /* 这 是 多 行 注释 */ std::cout<<"helloworld"<<std::endl; return0;}注释掉的内容不会被执行。单行注释:使用//开始,直到行尾的所有内容都会被视为注释。多行注释:使用/开始,以/结束。这种......
  • C++入门Day0:规划开启
    首先介绍一下自己本人初二生一枚,曾经有过编程基础(Python),也曾几次学习C++,但总是半途而废(悲),想要参加算法竞赛,所以开启计划,在180天看完 C++PrimerPlus,故制定了此计划。因为学业紧张(山东),每天实际能拿出来的时间仅有一小时,所以放慢进度,争取吃透本书。每日学习计划(24周)第......
  • (C/C++)文件
     目录1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件3.文件的打开和关闭3.1文件指针3.2文件的打开和关闭4.文件的顺序读写fputcfgetcfputsfgetsfprintffscanffwritefreadsprintf和sscanf snprintf​编辑4对比一组函数(printf,sacnf系列)......