关于shallow copy

shallow copy (浅拷贝)是一种节省资源的方式,是一种write_on_copy,qt中很多的类(大部分是内存分配需要很多的类)都实现了shallow copy,比如 qimage类,让两个实例qimage a和qimage b,令a=b,则事实上,a并没有完全复制了一份b的所有信息,它只是在计数器上增加了一个对同一片内存的指向(当然也并非指针相等),如果a和b之中没有人进行改变,将一直共享一份内容,但当其中过一个发生改变时,它会自动复制一份这份信息的内容,作为自己的无论怎样修改都行,也不回影响到其他的实例。

比如Qimage*a -new Qimage(); QImage b=*a;delete a,这个过程时这样的,开始a初始化了一块内存来表示一个qimage,然后b和a公用这个信息,计数器变为2,最后a不在了,计数器变一,b独享这份内容,此时a和b初始时的地址时一样的。

时间: 2024-09-18 10:19:05

关于shallow copy的相关文章

C# Tips-浅拷贝和深拷贝(shallow copy VS deep copy )

引言 C#中有两种类型变量,一种 是值类型变量,一种是引用类型变量,对于值类型变量,深拷贝和前拷贝都是通过赋值操作符号(=)实现,其效果一致,将对象中的值类型的字段拷贝到新的对象中.这个很容易理解. 本文重点讨论引用类型变量的拷贝机制和实现. C#中引用类型对象的copy操作有两种: 浅拷贝(影子克隆/shallow copy):只复制对象的值类型字段,对象的引用类型,仍属于原来的引用. 深拷贝(深度克隆):不仅复制对象的值类型字段,同时也复制原对象中的对象.就是说完全是新对象产生的. 浅拷贝和

.NET深入学习笔记(4):深拷贝与浅拷贝(Deep Copy and Shallow Copy)

今天继续利用准备WSE安全开发文章的空闲时间,完善<.NET深入学习笔记>系列(基本都是.Net重要的知识点,我都做了详细的总结,是什么.为什么.和怎么实现).想必很多人也接触过这两个概念.做过C++的人对深浅拷贝的概念一定不会陌生.而其很多C#高级软件工程师的面试里也会问到深浅拷贝相关的问题.我今天就在总结一下,并且添加了详细的代码实现,与大家分享.一起学习一下C#的深拷贝与浅拷贝(Deep Copy and Shallow Copy)的机制.全文还是分三部分:1.基本概念 2.深拷贝与浅拷

hashmap中的clone为什么是shallow copy of this map

问题描述 public Object clone() { HashMap<K,V> result = null;try { result = (HashMap<K,V>)super.clone();} catch (CloneNotSupportedException e) { // assert false;} result.table = new Entry[table.length]; result.entrySet = null; result.modCount = 0;

浅复制(Shallow Copy)与深复制(Deep Copy)

复制:对象的复制是生成一个与指定对象完全一样的新对象,实现的方式根据定义可以知道,新建一个类型相同的对象,然后复制原对象的每一个成员和字段.  浅复制: class Program { static void Main(string[] args) { ClassA A = new ClassA(); CloneObj clone = new CloneObj(); ClassA newA= clone.CloneA(A); } } public class ClassA { public In

C++对象模型(二):The Semantics of Copy Constructors(拷贝构造函数之编译背后的行为)

本文是 Inside The C++ Object Model's Chapter 2  的部分读书笔记. 有三种情况,需要拷贝构造函数: 1)object直接为另外一个object的初始值 2)object作为函数以值传递的参数 3) object以函数返回值形式返回 如果class没有提供一个explicit copy constructor时,编译器会以default memberwise initialization,也就是把每一个内建的或者派生的data member的值,从某个obj

python copy-求大神名明示python中copy 与 &amp;amp;#39;=&amp;amp;#39; 的区别

问题描述 求大神名明示python中copy 与 '=' 的区别 如图, a=b // a is b c=b.copy() // c not b 为什么呢== 其次,在上图的基础上,为什么 a=1000 后,b依然不变,在这点上貌似 = 与 copy 都这样...混成一锅粥了,求高人指点迷津 解决方案 = 是引用,python中缺省都是引用 copy是复制一个对象.所以产生一个新对象,里面的数据复制了一份 解决方案二: - A shallow copy constructs a new comp

PHP面向对象精要总结

 1 使用extends实现继承以及重载.魔术方法的含义 class B extends A 声明的时候B里可以没有A里的方法 调用的时候: $b=new B(); $b->A里的方法(); $b->A里的属性=1; $b->B里的方法(); $b->B里的方法(); 如果$a=new A(); 可以 $a->A里的方法(); $a->A里的属性=1; 不可以 $a->B里的方法(); $a->B里的方法();   重载:B继承A ,B里实现和A同名的方法属

JavaScript中的prototype(原型)属性研究

javascript 我们知道Jscript中对象的prototype属性,是用来返回对象类型原型的引用的.我们使用prototype属性提供对象的类的一组基本功能.并且对象的新实例会"继承"赋予该对象原型的操作.但是这个prototype到底是怎么实现和被管理的呢? 对于对象的prototype属性的说明,Jscript手册上如是说:所有 Jscript 内部对象都有只读的 prototype 属性.可以向其原型中动态添加功能(属性和方法),但该对象不能被赋予不同的原型.然而,用户定

TIJ阅读笔记(第十一章)

笔记 11:对象的集合  如果程序的对象数量有限,且寿命可知,那么这个程序是相当简单的.数组  数组与其它容器的区别体现在三个方面:效率,类型识别以及可以持有primitives.数组是Java提供的,能随机存储和访问reference序列的诸多方法中的,最高效的一种.数组是一个简单的线性序列,所有它可以快速的访问其中的元素.但是速度是有代价的:当你创建了一个数组之后,它的容量就固定了,而且在其生命周期里不能改变.也许你会提议先创建一个数组,等到快不够用的时候,再创建一个新的,然后将旧的数组里的